使函数等待按钮触发的参数更改

时间:2018-08-02 19:21:49

标签: python tkinter

以下是一个没有意义的程序,但是我想在较大的代码中执行类似的操作。调用了一个函数,我希望它等待参数的更改,该更改由按钮触发。运行此代码,当按下“确定”按钮时,不允许按下另一个按钮,该按钮将冻结。同样,在任何事情之前,我都会收到错误:在全局声明之前将名称“ 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()

1 个答案:

答案 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()