Ваша проблема не в «ссылке на переменную из другого класса». Когда вы запускаете ее в первый раз, текст «a, b». Даже если вы в следующий раз вызовете addvar()
, текст в метке выиграет не может быть изменено. Вы можете использовать textvariable
вместо text
в виджете 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.set(xx)
, чтобы установить ее.
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()