Я работал над созданием приложения, чтобы помочь некоторым нашим офисным работникам. У меня работает какой-то скелет, но моя проблема в том, что я не могу заставить свои окна обновлять свои значения после их инициализации.
У меня есть глобальные переменные и некоторые функции get и set:
building = "SomeBuilding"
def setBuilding(bldg):
global building
building = bldg
print("building:", building)
def getBuilding():
print("Building from get:",building)
return building
И у меня есть класс, который используется для создания приложения и фреймов:
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
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 (StartPage, PageOne,PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.update()
frame.tkraise()
Проблема возникает, когда я беру некоторые значения из фрейма и сохраняю их в глобальной переменной. Глобальная переменная обновляется, но при переходе к следующему кадру у меня есть метка, которая отображает значение глобальной переменной. Это значение, которое изначально было глобальной переменной.
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
#buidling
bldg_label = ttk.Label(self, text="Building Name (ie. Bldg1):", font=LARGE_FONT)
bldg_label.grid(row=0, column=0, padx=2, pady = 10)
self.bldg_var = tk.StringVar()
bldg_entry =ttk.Entry(self,width = 6, textvariable = self.bldg_var)
bldg_entry.grid(row=0, column=1, padx=2, pady=10)
В этом классе у меня есть кнопка, которая устанавливает значения входа в здание
button2 = ttk.Button(self, text="Apply",command=lambda: setBuilding(self.bldg_var.get()))
button2.grid(row=row_num, column = 1)
и кнопка для перехода к следующему кадру:
button3 = ttk.Button(self, text="next", command = lambda: controller.show_frame(PageTwo))
Когда PageTwo затем поднимается, он печатает этикетку здания со старым значением "SomeBuilding"
вместо того, что отправил пользователь. Я попытался, как вы можете видеть, вызвать глобальную переменную и затем распечатать ее в надежде получить значение, но получить только то же самое старое значение, я также попытался использовать обновление, но оно не работает. Любая помощь будет принята с благодарностью. Я искал в Интернете примеры, но они просматривают только одну страницу или фрейм, но не обновляются между фреймами. Спасибо!
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
row_num = 0
global building
used_building = building
bldg_label = ttk.Label(self, text = "Building: " + used_building, font=LARGE_FONT)
bldg_label.grid(row = row_num, column =0)