Как я могу применить классы к своему приложению Tkinter? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать приложение, в котором внутри основного фрейма есть два других фрейма (из стороны в сторону).

Левая рамка состоит из кнопок, которые всегда видны. Эти кнопки изменят содержимое правой рамки.

Я сделал это успешно, назначив каждую кнопку определению, которое воссоздает кнопки в левом кадре, очищает содержимое в правом кадре и переписывает то, что входит в правый кадр.

Это работает, но я хотел бы узнать больше о различных / более эффективных способах сделать это.

Последние пару дней я искал способ включения классов, и это то, что я нашел.

class SeaofBTCapp(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 = {}

        frame = StartPage(container, self)

        self.frames[StartPage] = frame

        frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

Этот класс помогает создать контроллер, в котором вы можете перемещаться по кадрам.

У меня проблема с созданием рамки, которая всегда видна, поскольку def show_frame изменяет содержимое всего окна.

У меня была идея, где я могу добавить эту структуру в класс с именем 'RightFrame', который не является основным окном, но я понятия не имею, как бы заставить фреймы и кнопки взаимодействовать друг с другом.

Я - полный новичок в кодировании, поэтому любые указатели были бы оценены.

1 Ответ

0 голосов
/ 28 августа 2018

tkraise() просто переносит вызываемый виджет на передний план, что означает, что он изменит только ту часть окна, в которой находится вызываемый виджет.

Все кадры, которые могут быть изменены, находятся в container, поэтому поднятие любого из этих кадров повлияет только на ту часть окна, где container. Поэтому вы можете поместить другой кадр рядом с container, на который не повлияет изменение кадра внутри container:

left_frame = tk.Frame(self)
left_frame.pack(side="left", fill="both", expand = True)
container = tk.Frame(self)
container.pack(side="left", fill="both", expand = True)

label = tk.Label(left_frame, text="This is the left frame", font=self.title_font)
label.pack(side="top", fill="x", pady=10)

или

left_frame = LeftFrame(self)
left_frame.pack(side="left", fill="both", expand = True)
container = tk.Frame(self)
container.pack(side="left", fill="both", expand = True)

class LeftFrame(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="This is the left frame", font=parent.title_font)
        label.pack(side="top", fill="x", pady=10)
...