以下是一个没有意义的程序,但是我想在较大的代码中执行类似的操作。调用了一个函数,我希望它等待参数的更改,该更改由按钮触发。运行此代码,当按下“确定”按钮时,不允许按下另一个按钮,该按钮将冻结。同样,在任何事情之前,我都会收到错误:在全局声明之前将名称“ boton”分配给了它。谢谢阅读。致敬。
from Tkinter import *
import time
master = Tk()
def callback():
w1['text']="this"
while boton==0:
time.sleep(1)
w1['text']="and then this"
def switch():
if boton==0:
global boton
boton=1
if boton==1:
global boton
boton=0
boton=0
w1 = Label(master, text="")
w1.grid(row=0, column=0)
e1 = Entry(master)
e1.grid(row=0, column=1)
b = Button(master, text="OK", command=callback)
b.grid(row=1, column=0)
b2 = Button(master, text="switch", command=switch)
b2.grid(row=1, column=1)
mainloop()
答案 0 :(得分:1)
您遇到了一些问题,而两个大问题正在干扰Tkinter mainloop()
。
当您按下OK
时,您的程序陷入了while循环中,永远不会中断。请记住,Tkinter在单个线程上运行,并且每次创建循环时,它都会阻塞mainloop()
表单,直到该循环中断为止。为了解决这样的问题,我们可以使用after()
方法来安排和安排事件,使其成为mainloop()
的一部分。阻塞mainloop()
的第二个问题是sleep()
方法。直到时间到了,这都会产生相同的影响。
我们还需要确保您使用的是if / else语句,因为您的Switch()
和if
语句将始终显示第二个文本。
在此之后,我们需要做的只是一点清理工作。
我们应该from Tkinter import *
而不是import Tkinter as Tk
。这样可以避免我们从其他导入或我们创建的变量中覆盖任何方法。
您无需在每个if语句中执行global
。您只需要在功能顶部即可。
看看下面的代码。
import Tkinter as tk
master = tk.Tk()
def callback():
global boton, w1
w1.config(text="this")
if boton == 0:
master.after(1000, callback)
else:
w1.config(text="and then this")
def switch():
global boton
if boton==0:
boton=1
else:
boton=0
boton=0
w1 = tk.Label(master, text="")
w1.grid(row=0, column=0)
e1 = tk.Entry(master)
e1.grid(row=0, column=1)
tk.Button(master, text="OK", command=callback).grid(row=1, column=0)
tk.Button(master, text="switch", command=switch).grid(row=1, column=1)
master.mainloop()