使用after()方法更新标签值。

时间:2015-03-20 12:06:33

标签: python-2.7 tkinter

我正在尝试创建一个包含十个标签的页面,然后使用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次迭代时,一个值被接收,屏幕向上移动,第一个值被丢弃,第二个值显示在第一个标签位置..

2 个答案:

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