Как вернуться из функции только после выполнения определенного условия - PullRequest
0 голосов
/ 11 мая 2019

Как мне вернуться обратно из функции «подсказка», только если и после того, как пользователь ввел ввод в виджете ввода для функции, которая его вызвала.

def prompt(to_speak,label_text,prompt):
   name = ""
   main = Toplevel()
   label = Label(main,text = label_text)
   label.grid()
   var = StringVar()
   entry = Entry(main)
   entry.focus()
   entry.grid()
   entry.config(textvariable = var)

   def get_input():
      print("function call has occured")

      global name
      name = var.get()
      if not input:
          speak(prompt)
      else:
          main.destroy()

   button = Button(main,text = "Proceed",fg = "white",bg = "#1287A8",command =  get_input)
   button.grid()
   speak(to_speak)



   if name:
      return name
   main.mainloop()

Я определил обратный вызовфункция "get_input", чтобы получить входные данные из виджета ввода после нажатия кнопки "продолжить".Он будет проверять, введен ли пользователь во ввод или нет.Если он введен, это уничтожит Toplevel, и я хотел бы, чтобы этот ввод был возвращен функции, которая вызвала «prompt», если пользователь не ввел ввод, он предупредит пользователя.

Но если пользователь имеетвведенный на вход, то я хотел бы вернуть этот вход в функцию, которая вызвала функцию «подсказки».

Я пытался реализовать его, используя условие if, но если условие проверяется только один раз, и это слишком много до нажатия кнопки «Продолжить».

Можно ли проверять условие "if" каждый раз после выполнения функции "get_input".

Или еще есть какой-нибудь способ добиться этого?

1 Ответ

0 голосов
/ 06 июня 2019

Как уже упоминалось в комментарии

Tkinter.Widget.wait_window-метод

Я хотел, чтобы виджет "main" был уничтожен только после того, как пользователь ввел ввод и вернул введенное пользователем значение функции вызова. Это делает именно wait_window ().

    main.wait_window(main) #in my case the parent widget is main and the widget to be destroyed is also main.      
    return name

Операторы после wait_window () не будут выполняться до тех пор, пока не будет уничтожен нужный виджет. Только после уничтожения намеченного виджета будут выполнены операторы, следующие за wait_window().

Таким образом, здесь основной виджет не будет уничтожен до тех пор, пока пользователь не введет ввод, как только он войдет во вход, основной виджет будет уничтожен, и будет выполнен оператор ниже wait_window (), т.е. return name.

...