更新Tkinter

时间:2018-05-08 21:32:11

标签: python tkinter frames ttk

我一直致力于创建一个应用程序来帮助我们的一些办公室工作人员。我有一些骨架工作,但我的问题是我无法让我的窗口在初始化后更新它们的值。
我有全局变量以及一些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)

0 个答案:

没有答案