下面是一个没有意义的程序,但是我想在更大的代码中做一些类似的事情。调用了一个函数,我希望它等待参数发生变化,该变化由按钮触发。运行这段代码,当按下 OK 按钮时,它不允许按下另一个按钮,它会卡住。同样在任何事情之前,我得到错误:在全局声明之前分配了名称'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()
最佳答案
你有一些问题,两个大问题正在中断 Tkinter mainloop()
。
当您按下 OK
时,您的程序会陷入一个永远无法中断的 while 循环。请记住,Tkinter 在单个线程上运行,任何时候您创建一个循环,它都会阻止 mainloop()
表单工作,直到该循环被打破。为了解决这样的问题,我们可以使用 after()
方法来安排和事件作为 mainloop()
的一部分发生。阻止 mainloop()
的第二个问题是 sleep()
方法。在时间结束之前,这将产生相同的效果。
我们还需要确保您使用的是 if/else 语句,因为您的 Switch()
您的 if
语句将始终产生第二个文本。
有了这些,我们现在需要做的就是稍微清理一下。
我们应该做 import Tkinter as Tk
而不是 from Tkinter import *
。这将使我们不会覆盖来自其他导入或我们创建的变量的任何方法。
您不需要在每个 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()
关于python - 制作一个等待参数更改的函数,由按钮触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51660795/