Python 创建一个函数,等待由按钮触发的参数更改
下面是一个没有意义的程序,但我想在更大的代码中做一些类似的事情。一个函数被调用,我想让它等待一个参数的改变,这个改变是由一个按钮触发的。运行此代码时,当按下OK按钮时,不允许按下另一个按钮,它会冻结。同样在任何事情之前,我得到了一个错误:名称“boton”被分配到全局声明之前。谢谢你的阅读。萨卢多斯Python 创建一个函数,等待由按钮触发的参数更改,python,tkinter,Python,Tkinter,下面是一个没有意义的程序,但我想在更大的代码中做一些类似的事情。一个函数被调用,我想让它等待一个参数的改变,这个改变是由一个按钮触发的。运行此代码时,当按下OK按钮时,不允许按下另一个按钮,它会冻结。同样在任何事情之前,我得到了一个错误:名称“boton”被分配到全局声明之前。谢谢你的阅读。萨卢多斯 from Tkinter import * import time master = Tk() def callback(): w1['text']="this" while bo
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语句将始终产生第二个文本
有了这些,我们现在需要做的就是清理一下
我们应该做将Tkinter作为Tk导入,而不是从Tkinter导入*
。这将防止我们重写来自其他导入或我们创建的变量的任何方法
您不需要在每个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()
1.不要在tkinter中使用
sleep()
。它将冻结该程序。2.您在switch()
函数中编写了boton
,但由于您的函数将其视为局部变量,因此boton==0
不能表示任何内容,因为局部(函数内部)未声明该变量。将此行添加到开关()的顶部<代码>全球博通
。谢谢!非常清楚我错的原因,并提供代码@Palki乐于帮助。