Как использовать статусбар во многих фреймах? - PullRequest
0 голосов
/ 18 мая 2018

Мне удалось создать небольшой графический интерфейс, где я могу переключаться между кадрами, относящимися к следующему вопросу: Переключаться между кадрами в tkinter

Я хотел, чтобы строка состояния находилась внизумой графический интерфейс и он должен оставаться на каждом кадре! В строке состояния отображается информация о кнопках при наведении на нее курсора!

Не зависает:

enter image description here

Hovered:

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 голосов
/ 18 мая 2018

Сначала переместите строку состояния в главное приложение, поскольку оно является частью приложения, а не частью страницы:

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")
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...