【问题标题】:Tkinter not waiting for user input inside functionsTkinter 不等待函数内部的用户输入
【发布时间】:2019-10-01 13:53:31
【问题描述】:

我正在尝试制作一个程序,当满足条件时,它会回到开头并等待。但不是等待用户按下按钮,而是继续执行代码。

我正在使用 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

然后等待用户选择按钮。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    如果您希望函数等待用户操作,则需要明确告诉它等待。

    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.")
    

    当您修改代码以包含上述 sn-p 时,您会注意到“等待...”将打印在标准输出上,然后在您单击“执行其他操作”之前不会打印任何其他内容按钮和something 返回,允许修改变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多