【问题标题】:Python tkinter change variable label state and statusbarPython tkinter 更改变量标签状态和状态栏
【发布时间】:2016-10-18 11:49:43
【问题描述】:

我这里确实有一点问题。这是关于 TKinter 中标签变量的交换。我的程序不会刷新值。

class Application(Frame):
    def __init__(self,parent,**kw):
         Frame.__init__(self,parent,**kw)
         self.x = None
         self.directory = None
         self.autostate = None
         self.state = "closed"
         self.GUI2()

     def state(self):
         #change states
         self.stateVar="open"
         self.statusbar = "Status: Opening gate..."

         #update tkinter
         self.group.update_idletasks()
         self.w.update_idletasks()

     def GUI2(self):

         self.statusbar = "Status:..."

         # menu left
         self.menu_left = tk.Frame(root, width=150, bg="red", bd=1, relief=RIDGE)
         self.menu_left_upper = tk.Frame(self.menu_left, width=300, height=900, bg="#C0C0C0")
         self.menu_left_lower = tk.Frame(self.menu_left, width=300, bd=1, relief=GROOVE)

         self.label1 = tk.Label(self.menu_left_lower, relief=FLAT, bg="blue" )
         self.button1 = Button(self.menu_left_lower, text="RUN")
         self.test = tk.Label(self.menu_left_upper, text="info", bg="#C0C0C0")


         self.menu_left_upper.pack(side="top", fill="both", expand=TRUE)
         self.menu_left_lower.pack(side="top", fill="both", expand=FALSE)

         # right area
         self.some_title_frame = tk.Frame(root, bg="#dfdfdf", bd=1, relief=RIDGE)
         self.some_title = tk.Label(self.some_title_frame, text="some title", bg="#dfdfdf")
         self.text_area = Listbox(root, width=50, height=10, background="#ffffff", relief=GROOVE)

         #Label and Button
         self.group = LabelFrame(self.menu_left_upper, text="info", height=70)
         self.group.pack(side="top", fill="both", expand=TRUE)
         Button(self.menu_left_lower, text='Press', command=self.state).pack(side="bottom")
         self.w = Label(self.group, text='State='+self.stateVar)    #text printed!
         self.w.pack(expand=TRUE)

         # status bar
         self.status_frame = tk.Frame(root)
         self.status = tk.Label(self.status_frame, text=self.statusbar, bd=1, relief=SUNKEN)    #statusbar printed here
         self.status.pack(fill="both", expand=True)
         self.menu_left.grid(row=0, column=0, rowspan=2, sticky="nsew")
         self.status_frame.grid(row=2, column=0, columnspan=2, sticky="ew")
         root.grid_rowconfigure(1, weight=1)
         root.grid_columnconfigure(1, weight=1)

 #Starts the main loop and causes the class to interact with the init function
 if __name__ == '__main__':
    root = Tk()
    root.title("simulation")
    app = Application(root)
    app.grid()
    root.mainloop()

在这里你可以看到整个代码。

检查 #tab1 很重要,那里会有按钮。这个按钮是指def state(self):这个需要改变label和statusbar。包含在 self.wself.status 的程序中,我在该行之后添加了一个 #textprinted!

【问题讨论】:

  • 这个具体问题的代码太多了。请阅读How to create a Minimal, Complete, and Verifiable example
  • 我减少了一点。但是如果我把它变小,程序就不会运行。我需要一些我在程序中想要的元素。重要的代码段都标明了,你可以看最后一句我的意思。

标签: python class tkinter


【解决方案1】:

错误出现在Label 参数中:如果输入变量更新,则 tekst 参数更新。您应该将stateVar 分配给Labeltextvariable 关键字参数,并且不要使用text 参数。

【讨论】:

    【解决方案2】:

    下面是一个示例程序,可以帮助您了解如何更改标签的文本。他们的关键是创建一个 StringVar 并将标签指向这个标签,以便在 StringVar 出现时更新标签。

    from Tkinter import *
    
    class Application(Frame):
        def __init__(self,parent,**kw):
            Frame.__init__(self,parent,**kw)
            # Create a String variable to store our status string
            self.stateVar = StringVar()
            self.stateVar.set("Initial Value")
    
            # Create a label to display the status
            self.label1 = Label(textvariable=self.stateVar)
            self.label1.grid()
    
            # Create a button which will change the status
            self.button = Button(text="Press me", command=self.change)
            self.button.grid()
    
        def change(self):
            """Called when the button is pressed"""
            self.stateVar.set('You pressed the button')
    
    
    if __name__ == '__main__':
        root = Tk()
        root.title("simulation")
        app = Application(root)
        app.grid()
        root.mainloop()
    

    【讨论】:

    • 谢谢,这正是我需要的!我已经尝试过一些非常相似的东西,但这很好用。谢谢
    • 你没有使用StringVar。你可以,但这不是绝对必要的。您可以直接更新标签。
    • 是的。 self.label1['text'] = "new string" 而不是 self.stateVar.set(...) 也很好用
    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多