我正在处理一段很长的代码,我希望在多个窗口中多次使用GUI输入。
代码太长了,如果我把它放在这里就没有多大意义,但这是我代码的布局:
callback1():
do something
tkinter stuff, using callback1()
...
lots of other code (none to do with tkinter)
...
callback2():
do something else
tkinter stuff using callback2()
some more code (none to do with tkinter)
mainloop()
对于模糊的结构感到抱歉,但这或多或少是我的代码的布局。问题是,似乎永远不会到达mainloop(),并且回调之间的其他代码依赖于GUI的输入,因此它崩溃了。
我试过了:
tkinter stuff, using callback1()
...
lots of other code (none to do with tkinter)
...
callback2():
do something else
tkinter stuff using callback2()
some more code (none to do with tkinter)
mainloop()
但没有运气。任何人都可以帮助我正确使用after()(或任何其他功能),以便我可以让GUI显示?
答案 0 :(得分:1)
您无法像这样整理代码。据推测,你有类似的东西:
import tkinter as tk
mainwindow = tk.Tk()
mainwindow.geometry("300x200")
mainwindow.title("MyWindow")
label = tk.Label(mainwindow, text="Enter stuff, then click the button.")
label.pack()
var = tk.StringVar()
entry = tk.Entry(mainwindow, textvariable=var)
entry.pack()
#callback1():
def onclick():
#do something with var.get() ?
pass
button = tk.Button(mainwindow, text="click me", command=onclick)
button.pack()
#lots of other code (none to do with tkinter):
print("The value I need is: {}".format(var.get()))
mainwindow.mainloop()
该程序的输出是:
我需要的价值是:
您需要将代码放在回调函数或回调函数调用的其他函数中:
def my_func():
print("The value I need: {}".format(var.get()))
def onclick():
#do something with var.get()
my_func()
button = tk.Button(mainwindow, text="click me", command=onclick)
现在,输出类似于:
我需要的价值是:10
tkinter
是一个GUI框架,它响应窗口中发生的事件。您对事件的响应方式是将代码包装在回调函数中并将该函数传递给tkinter,然后tkinter将在适当的时间调用该函数。你不要在tkinter程序中编写任意代码。
after()
方法似乎不合适,因为它基本上是这样说的:
在mainloop启动后,执行此功能。
您可以延迟执行所需的许多秒 - 但这并不意味着用户将输入您需要的数据。您要做的是在用户输入数据后执行您的代码,通常是通过响应按钮单击,按钮显示,Submit
或其他一些事件来执行此操作。
答案 1 :(得分:1)
像tkinter这样的GUI框架是事件驱动的。他们在开始mainloop()
时开始运行。在那之前的一切基本上都是设置和管家。
在主循环启动后,他们运行的仅代码是您已经附加到界面元素(如按钮)或带有after
的计时器的回调。
这些回调必须相对较短,不应花费很长时间。 GUI工具包调用您提供的函数来处理mainloop中的事件。因此,当您的回调正在运行时,不会处理任何其他事件,并且GUI被有效冻结。如果这只需要一点时间(比如50毫秒),没有人会注意到。 但是如果你想运行一个需要几秒钟才能完成的计算,你就不能在没有冻结GUI的情况下在回调中做到这一点。
您可以考虑在第二个线程中执行长时间运行的作业。但是在CPython中,由于技术原因,一次只能有一个线程执行Python字节码。但是(特别是在Python 3中)线程被迫定期放弃CPU,因此这可能是一个可行的解决方案。
另一种解决方案是使用multiprocessing
将长时间运行的作业存储到单独的进程中。在这种情况下,您必须通过例如设置进程之间的通信。 Queue
。