Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 更改StringVar()变量时,标签未更新_Python 2.7_Tkinter - Fatal编程技术网

Python 2.7 更改StringVar()变量时,标签未更新

Python 2.7 更改StringVar()变量时,标签未更新,python-2.7,tkinter,Python 2.7,Tkinter,对于我的程序,我使用StringVar()变量在屏幕之间传递一个值,这意味着我可以处理一些文本并在下一个“屏幕”上显示它 完整程序 在这个程序中,我创建了一个名为foo的stringvariable root=tk.Tk() foo=encrypted_message=tk.StringVar() 然后,我在容器类中创建一个简单的函数,将两个条目添加到一起,然后将stringvar设置为结果 def add(self,a,b): c=str(int(a

对于我的程序,我使用
StringVar()
变量在屏幕之间传递一个值,这意味着我可以处理一些文本并在下一个“屏幕”上显示它

完整程序

在这个程序中,我创建了一个名为foo的stringvariable

    root=tk.Tk()
    foo=encrypted_message=tk.StringVar()
然后,我在容器类中创建一个简单的函数,将两个条目添加到一起,然后将stringvar设置为结果

    def add(self,a,b):
        c=str(int(a)+int(b))
        foo.set(c)
        self.show_frame("Screen2")
然后我调用屏幕1上的命令

    button1=tk.Button(self,text="Lorem",command=lambda: controller.add(entry1.get(),entry2.get()))
现在,我想将屏幕2上的标签更改为我设置的字符串var()的值

    label1=tk.Label(self,textvariable=foo)
当我运行程序时,屏幕2只是一个空白屏幕,即使我更改了stringvar的值,标签文本也没有更新

完整程序

    import Tkinter as tk
    class ProgramScreen(tk.Tk):
        def __init__(self,*args,**kwargs):
            tk.Tk.__init__(self,*args,**kwargs)
            container=tk.Frame(self)
            container.pack(expand=True, fill="both")
            container.grid_rowconfigure(0,weight=1)
            self.frames={}
            self.foo=tk.StringVar()
            for F in (Screen1,Screen2):
                page_name=F.__name__
                frame=F(parent=container,controller=self)
                self.frames[page_name]=frame
                frame.grid(row=0,column=0,sticky="nsew")
                self.show_frame("Screen1")
        def show_frame(self,page_name):
            frame=self.frames[page_name]
            frame.tkraise()
        def add(self,a,b):
            c=str(int(a)+int(b))
            foo.set(c)
            self.show_frame("Screen2")
    class Screen1(tk.Frame):
        def __init__(self,parent,controller):
            tk.Frame.__init__(self,parent)
            self.controller=controller
            self.pack(fill="x",expand=1)
            entry1=tk.Entry(self)
            entry1.pack()
            entry2=tk.Entry(self)
            entry2.pack()
            button1=tk.Button(self,text="Lorem",command=lambda: controller.add(entry1.get(),entry2.get()))
                button1.pack()
    class Screen2(tk.Frame):
        def __init__(self,parent,controller):
            tk.Frame.__init__(self,parent)
            self.controller=controller
            self.pack(fill="x",expand=1)
            label1=tk.Label(self,textvariable=controller.foo.get())
            label1.pack()

    if __name__ == "__main__":
        app = ProgramScreen()
        app.mainloop()
--编辑--


我已经修复了在programScreen类中调用stringVar变量的代码。至少有一个问题是,您正在创建两个
Tk
实例。tkinter程序必须只有一个
Tk
实例。如果需要多个窗口,则除第一个窗口外的所有窗口都必须是
Toplevel

的实例。我的错误是使用了.get()函数,并且正确调用了Tkinter。

您需要提供一个非200行代码。另外,在完整代码上有太多不必要的注释。我看不出这里有什么问题,当我使用
加密的\u message.set('new text')
更改StringVar内容时,它确实会更新标签。我做了一个不同的示例,它给出了相同的问题。这里没有足够的代码来重现问题。请至少创建一个完整的示例。@BryanOakley paste.ee/p/0gMqKI无法在使用ProgramScreen类创建的Tk实例中定义字符串变量的位置