Tkinter не ждет ввода пользователя внутри функций - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь создать программу, которая при выполнении условий возвращается к началу и ждет. Но вместо того, чтобы ждать, пока пользователь нажмет кнопку, он продолжает код.

Я использую Python 3.7.4 и Windows 10. Я предполагаю, что эта проблема возникает, потому что tkinter не ждет ввода пользователя вэта ситуация, а вместо этого продолжается через код.

Мой код:

from tkinter import *
from tkinter.ttk import *

def start():
    print("Start")
    # Removes all widgets without destroying root
    for widget in root.winfo_children():
        widget.destroy()

    button_1 = Button(root, text="Begin", command=begin).pack()
    button_2 = Button(root, text="Do something else", command=something).pack()
    # I want the program to wait here for the user to click a button

def begin():
    print("\nDoing stuff")
    if True:
        start()
    print("This should not be printed")

def something():
    pass

root = Tk()
root.geometry("300x300")
btn1 = Button(root, text = "Start", command = start)
btn1.pack()
root.mainloop()

Это выводит:

Start

Doing stuff
Start
This should not be printed

Я хочу, чтобы это вывело:

Start

Doing stuff
Start

А затем дождитесьпользователю выбрать кнопку.

1 Ответ

2 голосов
/ 01 октября 2019

Если вы хотите, чтобы функция ожидала действия пользователя, вам нужно явно указать ей ждать.

Для этого у Tkinter есть три функции. Один из них - wait_window, который будет ожидать разрушения окна. Один из них - wait_visibility, который будет ожидать изменения видимости окна. Третий - wait_variable, который ожидает установки определенной переменной tkinter.

Пока tkinter ожидает, он может обслуживать другие события.

В вашем случае решение можетВыглядите примерно так:

var = BooleanVar(value=False)
def do_something():
    something()
    var.set(True)
button_2 = Button(root, text="Do something else", command=do_something).pack()

print("waiting...")
root.wait_variable(var)
print("done waiting.")

Когда вы измените свой код, включив в него приведенный выше фрагмент, вы заметите, что "ожидание ..." будет напечатано на стандартный вывод, а затем ничего не будет напечатано доВы нажимаете кнопку «Сделать что-то еще», и something возвращает, позволяя изменить переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...