Python Tkinter标签小部件不会更新

时间:2014-07-13 10:18:26

标签: python tkinter

这是一段简单的代码,根据我的意愿不起作用:

def get_tl(self,x):

    self.var_tl = IntVar()

    if x == "Random (max = 6)":
        self.var_tl.set(randint(1,6))        

    else:

        ask_tl = Toplevel()
        def destroy_t_set_tl():
            self.var_tl.set(entry_tl_t.get())
            ask_tl.destroy()

        label_tl_t = Label(ask_tl, text="length:").pack(side=LEFT)
        entry_tl_t = Entry(ask_tl, width=25)
        entry_tl_t.pack(side=LEFT)
        button_enter_tl_t = Button(ask_tl, text="Enter", command=destroy_t_set_tl).pack(side=LEFT)

    self.label_tl = Label(self, text="length:").grid(row=1,column=0)

    # This only shows the right number when "Random (max = 6)". When "Manual" it shows 0
    self.show_tl = Label(self, text=self.var_tl.get()).grid(row=1,column=1)

def get_values(self):

    # This always shows the right number.
    self.total_label = Label(self, text=self.var_tl.get()).grid(row=4,column=0)

函数get_tl由OptionMenu小部件调用,该小部件为x提供值:"Manual""Random (max = 6)"

当调用此函数时,我希望它选择一个随机数或打开一个Toplevel窗口,通过一个Entry向用户询问一个数字。选择随机数或用户给出数字后。该号码需要显示为标签,以便用户可以查看该号码是否正确。 标签仅在"Random (max = 6)"时显示正确的数字。当"Manual"显示为0

按下按钮后,将调用函数get_values。但是确实给出正确的数字,无论是手动还是随机。

我可能在这里犯了一个简单的错误。但我没有看到它。

2 个答案:

答案 0 :(得分:0)

在这部分:

def get_tl(self,x):

    self.var_tl = IntVar()

您反复重新创建变量,因此它保留默认值0,如the documentation中所述:

  

VALUE是可选值(默认为0)

然后,如果x == "Random (max = 6)"设置变量 ,那么在所有其他情况下,它将保持默认值。

可能你想删除这一行:

self.var_tl = IntVar()

你应该只在你班级的构造函数中拥有它。然后,您的所有方法将共享self.var_tl指向的同一实例。

答案 1 :(得分:0)

这似乎是我自己问题的答案:

def get_tl(self,x):

    def tl():
        self.label_tl = Label(self, text="length:").grid(row=1,column=0)
        self.show_tl = Label(self, text=self.var_tl.get()).grid(row=1,column=1)

    if x == "Random (max = 6)":
        self.var_tl.set(randint(1,6))
        tl()
    else: 


        ask_tl = Toplevel()
        def destroy_t_set_tl():
            self.var_tl.set(entry_tl_t.get())
            ask_tl.destroy()
            tl()

        label_tl_t = Label(ask_tl, text="length:").pack(side=LEFT)
        entry_tl_t = Entry(ask_tl, width=25)
        entry_tl_t.pack(side=LEFT)
        button_enter_tl_t = Button(ask_tl, text="Enter", command=destroy_t_set_tl).pack(side=LEFT)



def get_values(self):

    self.total_label = Label(self, text=self.var_tl.get()).grid(row=4,column=0)

现在选项"Manual""Random"都会调用函数tl(),它会显示数字,以便用户查看。 我还将self.var_tl = IntVar()移动到了类的构造函数中。它可能不是最佳解决方案,但对我来说它有效。