我正在尝试创建一个包含十个标签的页面,然后使用after()方法更新值。但是屏幕挂起。 开始定义是绑定到按钮创建标签,然后使用after方法我试图以递归方式调用更新方法来更新标签值。 是他们从main函数( main )调用update()方法的另一种方法。
def update(self,i):
self.lab_hold_X=25
self.data_hold_mL_screen[i].place(x=self.lab_hold_X,y=self.y_place)
self.data_hold_mL_screen[i]['text']=str(int(self.data_hold_mL_screen[i]['text']) + 1)
self.y_place +=30
self.valuess=i+1
if self.valuess <=10:
self.after(1000,self.update(self.valuess))
else :
self.valuess=0
self.after(1000,self.update(self.valuess))
def start(self):
self.lab_hold_X=25
self.lab_hold_Y=10
for i in range(0,10):
self.lab_hold_Y +=30
self.data_hold_mL_screen[i].place(x=self.lab_hold_X,y=self.lab_hold_Y)
self.lab_hold_X =25
self.after(1000,update(0))
我基本上希望创建一个页面,其中我可以从任何外部设备获取值,然后在屏幕上显示它,屏幕显示10个值,在第11次迭代时,一个值被接收,屏幕向上移动,第一个值被丢弃,第二个值显示在第一个标签位置..
答案 0 :(得分:3)
此:
self.after(1000,update(0))
......需要这样:
self.after(1000,lambda: update(0))
对于您呼叫after
的其他地方也是如此。 after
需要引用到函数,但您调用函数并将函数的结果传递给after
。而且由于你的函数什么也没有返回,所以在1000毫秒之后什么都没有执
答案 1 :(得分:1)
使用列表保存最后10个值的简单示例,以及用于保存已更新的Label的StringVars的第二个列表。请不要使用“i”,“l”或“O”作为单个字符变量名称,因为它们看起来像数字。
from Tkinter import *
from functools import partial
class LabelTest():
def __init__(self, master):
self.master=master
self.string_vars=[] ## contains pointers to the label vars
self.values=[]
self.start()
Button(self.master, text="Quit", bg="orange", width=15,
command=self.master.quit).grid(row=20)
self.update(1)
def update(self, ctr):
""" Change the StringVars to the new values
"""
if len(self.values) > 9:
## full so delete the first one
del self.values[0]
self.values.append(ctr)
## update the StringVar with the corresponding
## value from self.values
for offset in range(len(self.values)):
self.string_vars[offset].set(self.values[offset])
ctr += 1
if ctr < 20: ## let's put a limit on this
self.master.after(1000, partial(self.update, ctr))
def start(self):
""" create 10 labels with StringVars that can be changed
each time a new value is created
"""
for ctr in range(10):
var=StringVar()
lab=Label(self.master, textvariable=var).grid(row=ctr)
self.string_vars.append(var) ## the variables to be updated
## initial variable value
self.values.append("***") ## the values
master=Tk()
LabelTest(master)
master.mainloop()