Python 从另一个类引用变量 我根据我最初发布的内容编辑了我的代码。我用了一个过于简单的例子。我正在CalcVar类中向字典添加“my dict”,并希望在“display Var”页面上显示更新后的值。

Python 从另一个类引用变量 我根据我最初发布的内容编辑了我的代码。我用了一个过于简单的例子。我正在CalcVar类中向字典添加“my dict”,并希望在“display Var”页面上显示更新后的值。,python,tkinter,Python,Tkinter,我在下面提供了我的代码。没有错误,但它没有按我所希望的方式执行。在“Display Var”类中,我显示了myvar的输出。我希望它显示两个标签,一个写着‘dict 1’,另一个写着‘dict 2’。现在它只提取“dict 1”的原始值。程序的第一步是转到Calc Var页面,我将'dict 2'添加到mydict。从那里我想转到“Display Var”页面,并显示编辑过的词典,以便它显示“dict 1”和“dict 2”,但它只显示为“dict 1”。我如何让它显示为“dict 1”和“di

我在下面提供了我的代码。没有错误,但它没有按我所希望的方式执行。在“Display Var”类中,我显示了myvar的输出。我希望它显示两个标签,一个写着‘dict 1’,另一个写着‘dict 2’。现在它只提取“dict 1”的原始值。程序的第一步是转到Calc Var页面,我将'dict 2'添加到mydict。从那里我想转到“Display Var”页面,并显示编辑过的词典,以便它显示“dict 1”和“dict 2”,但它只显示为“dict 1”。我如何让它显示为“dict 1”和“dict 2”

非常感谢您的帮助

import tkinter as tk

LARGE_FONT= ("Times New Roman", 22)


class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global mydict
        mydict = {'dict1' : {"a b c" : 123}} # set its value


        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (CalcVar, DisplayVar):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)


        def addvar():
            global mydict
            #myvar.set(myvar.get()+" c") # when add the value.
            dict2 = {'d e f' : 456}
            mydict['dict 2'] = dict2
            print(mydict)



        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)



        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()


        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()



class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global mydict

        for x, y in mydict.items():
            label = tk.Label(self, text=x, font=LARGE_FONT) 
            label.pack(pady=10,padx=10)


        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

您的问题不是引用另一个类中的变量。第一次运行时,文本为a,b。即使您下次调用addvar,标签中的文本也不会更改。您可以使用textvariable而不是label小部件中的文本

然后是您的代码:

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global myvar # global
        myvar = tk.StringVar() # create a StringVar and assign it myvar
        myvar.set("a b") # set its value

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar():
            global myvar
            myvar.set(myvar.get()+" c") # when add the value.
            print(myvar.get())

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global myvar

        label = tk.Label(self, textvariable=myvar, font=LARGE_FONT) # bind a textvariable not text
        label.pack(pady=10,padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

app.mainloop()
编辑:即使您想使用dict,原理也是一样的。最简单的方法是使用textvaribale。但是如果您想在dict中显示字符串,只需使用myvar.setxx进行设置

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global myvar,mydict # global
        mydict = {'dict 1' : {"a b c" : 123}}
        myvar = tk.StringVar() # create a StringVar and assign it myvar
        myvar.set(" ".join(i for i in mydict)) # set "dict 1" string

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar():
            global myvar,mydict
            dict2 = {'d e f' : 456}
            mydict['dict 2'] = dict2 # add it to your dict
            myvar.set(" ".join(i for i in mydict)) # also set the vale and show it.
            print(myvar.get())

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=addvar)
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global myvar

        label = tk.Label(self, textvariable=myvar, font=LARGE_FONT) # bind a textvariable not text
        label.pack(pady=10,padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

app.mainloop()
我强烈建议您只使用\n来加入它们。如果您真的想创建两个标签小部件,这非常简单快速。这可能不是最好的方法:

import tkinter as tk

LARGE_FONT= ("Verdana", 12)

class MyApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        global mydict # global
        mydict = {'dict 1' : {"a b c" : 123}}

        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (CalcVar, DisplayVar):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(CalcVar)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class CalcVar(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        def addvar(p,c):
            global mydict
            for i in p.winfo_children()[0].winfo_children(): # delete all the widget in the displayVar
                i.pack_forget()
            mydict['dict 2']={'d e f':456}
            for i in mydict: # then pack them in it.
                tk.Label(p.winfo_children()[0],text=i).pack(pady=10,padx=10)
            button1 = tk.Button(p.winfo_children()[0], text="Back to Calculation Page",
                                command=lambda: c.show_frame(CalcVar))
            button1.pack()

        label = tk.Label(self, text="Calculation Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = tk.Button(self, text="Display Results",
                            command=lambda: controller.show_frame(DisplayVar))
        button.pack()

        calcbutton = tk.Button(self, text="AddVar",
                            command=lambda :addvar(parent,controller))
        calcbutton.pack()

class DisplayVar(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global mydict

        for i in mydict:
            print(i)
            tk.Label(self, text=i).pack(pady=10, padx=10)
        button1 = tk.Button(self, text="Back to Calculation Page",
                            command=lambda: controller.show_frame(CalcVar))
        button1.pack()

app = MyApp()
app.geometry('750x500')

app.mainloop()

谢谢,非常有帮助。如果myvar是一个字典而不是一个字符串呢?我编辑了我的原始代码以显示为字典。我试着按照你的建议去做,但是我仍然没有得到我想要的结果。非常感谢你的回复。非常有帮助,非常感谢!你只想让它显示dict1和dict2?很抱歉混淆了,我的示例变得混乱了。我想在“DisplayVar”选项卡上创建两个标签。一个标签上写着dict1,另一个标签上写着dict2。实际上,最终,我希望在“mydict”中有数量可变的字典,“DisplayVar”页面将创建一个标签,其中包含每个字典的名称。尝试使用字符串变量执行此操作时出现错误。您的代码有点难读。您可以在visual中将其设置为两个标签。请使用\n在dict中连接键。