如何在许多帧中使用状态栏?

时间:2018-05-18 12:47:40

标签: python python-3.x tkinter

我设法构建了一个小GUI,我可以在与以下问题相关的帧之间切换:Switch between frames in tkinter

我想在我的GUI底部有一个状态栏它应该保持在每一帧!状态栏显示悬停在它上面时按钮的信息!

没有徘徊:

enter image description here

盘旋:

enter image description here

正如你所看到的那样,但是当我引发另一个帧时,我无法让状态栏更新其值,因为我只能设法在一个帧类中创建状态栏......

class SampleApp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.title_font = font.Font(family='Helvetica', size=18, 
         weight="bold", slant="italic")
         container = 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 (start_frame, cr_frame, db_frame):
             page_name = F.__name__
             frame = F(parent=container, controller=self)
             self.frames[page_name] = frame
             frame.pack()
         self.show_frame("start_frame")

     def show_frame(self, page_name):
         '''Show a frame for the given page name'''
         for frame in self.frames.values():
            #frame.grid_remove()
            frame.pack_forget()
        frame = self.frames[page_name]
        frame.pack()

        if page_name == "start_frame":
            frame.winfo_toplevel().geometry("545x200")
        if page_name == "cr_frame":
            frame.winfo_toplevel().geometry("600x200")
        if page_name == "db_frame":
            frame.winfo_toplevel().geometry("700x630")

class start_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

    self.btn_cr = Button(self, text="Copyright Analyse", command=lambda: self.controller.show_frame("cr_frame"), width=40)        
    self.btn_cr.pack(side=LEFT, padx=15, pady=1, ipady=40)
    self.btn_db = Button(self, text="Copyright Datenbank", command=lambda: self.controller.show_frame("db_frame"), width=40)
    self.btn_db.pack(side=LEFT, pady=1, ipady=40)


    ###################Here is the statusbar defined + bindings and so on##########
    self.lbl_status = Label(self.controller, text="...", border=1, relief=SUNKEN, anchor=W)
    self.lbl_status.pack(side=BOTTOM, fill=X, anchor=W)
    self.btn_cr.bind("<Enter>", lambda event: self.lbl_status.configure(text="Open copyright analysis window..."))
    self.btn_cr.bind("<Leave>", self.leave_bindings)
    self.btn_db.bind("<Enter>", lambda event: self.lbl_status.configure(text="Open copyright database..."))
    self.btn_db.bind("<Leave>", self.leave_bindings)


class cr_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

现在,如果我切换到第2页(cr_frame),状态栏仍然存在,因为我将它附加到顶层控制器(所有帧)但我无法通过cr_frame类编辑它...

我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

首先,将状态栏移动到主应用程序,因为它是应用程序的一部分而不是页面的一部分:

class SampleApp(Tk):
    def __init__(self, *args, **kwargs):
        ...
        container = Frame(self)
        self.lbl_status = Label(self, text="", border=1, relief=SUNKEN, anchor=W)

        container.pack(side="top", fill="both", expand=True)
        self.lbl_status.pack(side="bottom", fill="x")

接下来,向应用添加方法以设置状态:

class SampleApp(Tk):
    ...
    def set_status(self, string):
        self.lbl_status.configure(text=string)

最后,无论何时需要更改状态,都要调用该方法:

class cr_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
    ...
    def something(self):
        ...
        self.controller.set_status("Hello, world")
        ...