我有一个按钮,通常用于在按下时打印一行数据 - 这部分工作正常。如果启用了另一个选项(复选框),则应连续打印数据,直到再次按下该按钮。因此,我将其标签更改为“Stop”并等待按钮状态从NORMAL更改为ACTIVE。但是,循环永远不会执行。这是相关的代码:
self.read_button = Button(master, text='Read Data', command=read_data)
.
.
def read_data(self):
if self.continuous.get()==1:
self.read_button['text']='Stop'
self.read_button['command']=None
self.read_button.update_idletasks()
# The data is never printed.
while self.read_button['state']==NORMAL:
print_data()
self.read_button['text']='Read Data'
self.read_button['command']=read_data
else:
print_data()
感谢您的帮助。这看起来很简单......
答案 0 :(得分:1)
一般来说,Tkinter不能很好地使用while循环。所有功能都需要及时结束,因此Tkinter可以倾向于其任务,例如重绘窗口并检查用户是否点击/输入任何内容。如果进入无限循环,UI将冻结并停止响应用户输入。如果您需要不断执行某些操作,则应使用after
或after_idle
方法。
示例:
from Tkinter import *
def print_data():
print "printing data..."
if read_button["text"] == "Stop":
#call this again in 10 milliseconds
root.after(10, print_data)
def read_button_clicked():
read_button.config(command=stop_button_clicked)
read_button.config(text="Stop")
print_data()
def stop_button_clicked():
read_button.config(command=read_button_clicked)
read_button.config(text="Read Data")
root = Tk()
read_button = Button(root, text="Read Data", command=read_button_clicked)
read_button.pack()
root.mainloop()