Tkinter程序的行为并不像我认为的那样

时间:2015-07-20 21:58:32

标签: python tkinter

我的柜台不会停止。当我第二次点击开始时,我希望它继续计数而不是重新启动。

from tkinter import *

master = Tk()

Counter_Activation_Variable=3

def start():
    Counts=0
    Counter_Activation_Variable=0
    button.configure(text = "Stop", command=stop)  
    while Counter_Activation_Variable == 0:
        Counts = Counts+1
        Textbox.delete(1.0, END)
        Textbox.insert(END,(Counts))
    master.update()

def stop():
    Counter_Activation_Variable=5
    button.configure(text = "Start", command=start)
    master.update()

button = Button(master, text="Start",command=start, bg="grey")
button.pack(side='bottom', fill='none', expand=False, padx=4, pady=4)
master.title("Stopwatch")

Textbox = Text(master, height=1, width=175)
Textbox.pack(side='top', fill='none', expand=False, padx=4, pady=4)

master.mainloop()

1 个答案:

答案 0 :(得分:1)

这里有两个问题。更大,更明显的是范围问题。

简短的回答是你只需要两条额外的线来解决这个问题。

def start():
 global Counter_Activation_Variable  # add this
 Counts=0
...
def stop():
 global Counter_Activation_Variable  # and this
 Counter_Activation_Variable = 5

如果你不这样做,那么<{1}} 里面的变量Counter_Activation_Variable start()方法会引用另一个同样具有名称{{1}的变量Counter_Activation_Variable方法内部,它与名为stop()的全局范围中的第三个​​变量完全分开。

这是因为Python允许您仅在特定区域(称为范围)中引用变量。因此,函数中定义的变量仅存在于该函数内。如果要写入全局变量,则必须将其明确标记为全局变量。 (Python允许您直接从全局变量中读取而不首先在函数内声明它)

我之前提到过的第二个函数是线程问题。我认为Counter_Activation_Variable中的while循环将占用所有的计算时间,因此,即使再次单击该按钮,start()方法也可能无法正确执行。

但是,我不太了解TKinter是否知道它是否为您处理那种GUI多线程 - 它很可能。