简体   繁体   English

Python Tkinter更改变量标签状态和状态栏

[英]Python tkinter change variable label state and statusbar

I do have a little problem here. 我在这里确实有一点问题。 It's about the exchange of variables of a label in TKinter. 这是关于TKinter中标签变量的交换。 My program won't refresh the value's. 我的程序不会刷新该值。

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

Here you can see the whole code. 在这里您可以看到整个代码。

It's importend to check # tab1 in there will be the button. 重要的是检查#tab1中是否有按钮。 This button refers to the def state(self): This one needs to change the label and the statusbar. 此按钮指的是def状态(自身):此按钮需要更改标签和状态栏。 wich are packed in self.w and self.status in the program I added a #text printed! 在程序中我将它们添加到self.wself.status中,并添加了一个#text打印内容! after the line. 下线之后。

The error is in the Label arguments: a tekst arguments is not updated if the input-variable is updated. 错误在于Label参数中:如果输入变量已更新,则不会更新tekst参数。 You should assign the stateVar to the Label 's textvariable keyword argument and use no text argument. 您应该将stateVar分配给Labeltextvariable关键字参数,并且不使用text参数。

Below is an example program that should help you figure out how to change the text of labels. 下面是一个示例程序,可以帮助您弄清楚如何更改标签的文本。 They key thing is creating a StringVar and pointing the label towards this so that the label is updated when the StringVar is. 他们的关键是创建一个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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM