Python 从另一个类引用变量 我根据我最初发布的内容编辑了我的代码。我用了一个过于简单的例子。我正在CalcVar类中向字典添加“my dict”,并希望在“display Var”页面上显示更新后的值。
我在下面提供了我的代码。没有错误,但它没有按我所希望的方式执行。在“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” 非常感谢您的帮助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
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中连接键。