Python 创建一个函数,等待由按钮触发的参数更改

Python 创建一个函数,等待由按钮触发的参数更改,python,tkinter,Python,Tkinter,下面是一个没有意义的程序,但我想在更大的代码中做一些类似的事情。一个函数被调用,我想让它等待一个参数的改变,这个改变是由一个按钮触发的。运行此代码时,当按下OK按钮时,不允许按下另一个按钮,它会冻结。同样在任何事情之前,我得到了一个错误:名称“boton”被分配到全局声明之前。谢谢你的阅读。萨卢多斯 from Tkinter import * import time master = Tk() def callback(): w1['text']="this" while bo

下面是一个没有意义的程序,但我想在更大的代码中做一些类似的事情。一个函数被调用,我想让它等待一个参数的改变,这个改变是由一个按钮触发的。运行此代码时,当按下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语句将始终产生第二个文本

有了这些,我们现在需要做的就是清理一下

我们应该做
将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乐于帮助。