вот объяснение кода, чтобы его было легче читать:
обертывающая функция main_loop вызывается ниже, в средстве выполнения функций.
сначала вам нужно щелкнуть поле ввода, чтобы начать печатать, после чего стандартный текст удаляется, и у вас появляется пустая доска для ввода
после ввода нажимаешь Enter один раз. Затем вы получаете ответ в терминале с просьбой нажать Enter, если хотите закончить, и нажать Backspace, чтобы вернуться к вводу.
Если вы нажмете Enter, вы больше не сможете печатать, и функция delete_input_field_variables используется для удаления всех переменные (это необходимо для создания чистого листа для многократного использования функции перекрытия). на этом этапе код должен вернуть входные данные.
Я исключил функцию, создающую переменные, потому что она работает отдельно и не мешает остальной части кода. если необходимо, прокомментируйте, если вы считаете, что было бы полезно иметь эту функцию здесь.
Я думаю, основная проблема заключается в том, что я не могу заставить функцию возвращать что-либо, в то время как я также стараюсь, чтобы она не возвращала значения постоянно, то есть операторы if.
Что продолжает происходить, так это то, что функция просто не возвращает значение. Я новичок в этих функциях вложения (это первый раз, когда я пытаюсь их использовать), и это только второй раз, когда я использую функции возврата, поэтому я понятия не имею, как и даже возможно ли то, о чем я прошу. любая помощь приветствуется.
edit
спасибо за комментарии, это мой первый вопрос здесь, поэтому комментарии по формулированию также очень приветствуются.описание всех функций:
- main_loop(): функция, которая вызывается и запускается только один раз. именно эта функция должна возвращать значение.
- input_field_create_and_starting_values(): создает и назначает переменные и список, необходимые для работы поля ввода, запускается только один раз из-за оператора if проверка того, находится ли созданная переменная в globals().
- allow_typing(): запускается, когда вы нажимаете на поле ввода, чтобы разрешить ввод.
- delete_input_field_variables (): функция, которая запускается при двойном нажатии клавиши Enter, удаляя все переменные, чтобы получить чистый лист для следующей итерации функции main_loop.
- keypress(): функция, которая запускается при нажатии клавиши выпускается, чтобы затем «ввести» этот символ.
- loop_in_loop(): функция, которая зацикливается внутри main_loop, чтобы продолжать повторять следующие функции:
< li>input_field_create_and_starting_values() (эта функция не обязательно должна быть здесь, она также может находиться на том же уровне отступа, что и функцияloop_in_loop()) - keypress() >
переформулируем проблему: мне нужна функция main_loop, чтобы возвращать значение (значение из переменной «ввод», который является вводом после двойного нажатия Enter). это означает, что мне нужно поместить возврат в конец main_loop (насколько я знаю). Мне кажется, что это требование означает, что оно попытается вернуть значение только один раз, при первом запуске функции main_loop, когда переменная return_value_activation еще не равна 1, поэтому она ничего не возвращает.
Я пытаюсь добиться того, чтобы функция main_loop() возвращала значение один раз в указанный мной момент (этот момент наступает после того, как вы дважды нажали Enter).ответ на первые комментарии:
- Джон Гордон: вы можете увидеть код изнутри (в строках возвращаемой функции, поэтому в набор отступов оператора if для «return_value_activation», который программа должна напечатать («возвращает входное значение сейчас») при запуске программы этот текст не печатается, поэтому я предполагаю, что это так. ничего не возвращать.
- Тим Робертс: функция, которая должна возвращать значение, — это функция main_loop().
Надеюсь, это поможет в будущих ответах.
import play
input_start = 'press to clear field and start typing'
async def main_loop(x_coordinate_input_field, y_coordinate_input_field, standard_text_input_field, input_field_height, input_field_width, explanation_text_words):
@play.repeat_forever
async def loop_in_loop():
await input_field_create_and_starting_values(x_coordinate_input_field, y_coordinate_input_field, standard_text_input_field, input_field_height, input_field_width, explanation_text_words)
@input_background.when_clicked
def allow_typing():
global allow_type
if 'allow_type' in globals():
if allow_type == 0:
allow_type = 1
if input_field.words == input_start:
input_field.words = ''
elif allow_type == 1:
print("allow_type is 1 when clicked")
async def delete_input_field_variables():
global stop_create, input_field, input_background, allow_type, check_input, character_list, overall_allow, explanation_text_screen
del stop_create, input_field, input_background, allow_type, check_input, character_list, overall_allow, explanation_text_screen
if 'allow_type' in globals():
print(f"This is allow_type right after delete: {allow_type}")
await play.timer(seconds=3)
async def check_allow_type():
if 'allow_type' in globals():
print('hallo')
print(f"allow_type is {allow_type}")
await play.timer(seconds=2)
await check_allow_type()
@play.when_any_key_released
async def keypress(key):
global input_field, check_input, allow_type, overall_allow, explanation_text_screen, input, return_value_activation
if 'overall_allow' in globals() and overall_allow == 1:
if key in character_list:
wait_time = 0.1
if allow_type == 1:
if check_input == 0:
if key != 'backspace' and key != 'space' and key != 'enter':
input_field.words += key
allow_type = 2
await play.timer(seconds=wait_time)
if key == 'backspace':
input_word = input_field.words
input_word = input_word[:-1]
input_field.words = input_word
allow_type = 2
await play.timer(seconds=wait_time)
if key == 'space':
input_field.words += ' '
allow_type = 2
await play.timer(seconds=wait_time)
if key == 'enter':
print('Are you sure you want to enter your input?')
print('Press enter to confirm, press backspace to continue editing your input')
allow_type = 0
await play.timer(seconds=wait_time)
check_input = 1
elif check_input == 1:
if key == 'backspace':
check_input = 0
allow_type = 2
elif key == 'enter':
input = input_field.words
print(f'This "{input}" is your input')
input_field.hide()
input_background.hide()
explanation_text_screen.hide()
allow_type = 0
overall_allow = 0
return_value_activation = 1
await delete_input_field_variables()
await play.timer(seconds=wait_time / 5)
allow_type = 1
if return_value_activation == 1:
print("returning input value now")
return(input)
@play.when_program_starts
async def runner():
print_test1 = await main_loop(0,0,input_start,100,play.screen.width - 200,'this is print_test1')
@play.repeat_forever
async def loop_print_test1():
global return_value_activation
if return_value_activation == 1:
await play.timer(seconds = 1)
print(f"print_test1 is {print_test1}")
play.start_program()
Подробнее здесь: https://stackoverflow.com/questions/788 ... e-it-to-re