Организация кода и создание нескольких виджетов внутри класса фрейма - PullRequest
0 голосов
/ 10 марта 2020

Просто пытаясь организовать мой код, я обнаружил, что в Интернете лучше всего поместить большую часть кода в классы, когда это необходимо. Таким образом, я решил, что попробую создать frame class с create_labels и create_buttons методами.

Моя цель - создать 2 или более отдельных фрейма, которые похожи по стилю (поэтому я считаю, что лучше всего создать класс кадров). Затем, используя методы, создайте метки, кнопки и другие виджеты и позволяйте им с легкостью перемещаться внутри своих соответствующих фреймов.

Итак, вот мой код:

import tkinter as tk
window = tk.Tk()


class MyFrame(tk.Frame):
    def __init__(self, parent, **kwargs):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.layout(**kwargs)

    def labels(self, text, **kwargs):
        tk.Label.__init__(self, text=text)
        self.layout(**kwargs)

    def buttons(self, text, command, **kwargs):
        tk.Button.__init__(self, text=text, command=command)
        self.layout(**kwargs)

    def layout(self, row=0, column=0, columnspan=None, row_weight=None, column_weight=None, color=None, sticky=None, ipadx=None, padx=None, ipady=None, pady=None):
        self.grid(row=row, column=column, columnspan=columnspan, sticky=sticky, ipadx=ipadx, padx=padx, ipady=ipady, pady=pady)
        self.grid_rowconfigure(row, weight=row_weight)
        self.grid_columnconfigure(column, weight=column_weight)
        self.config(bg=color)


frame_1 = MyFrame(window, row=0, column=0, sticky="news", color="pink")
frame_1.buttons("Btn_1/Frme_1", quit, row=0, column=0)
frame_1.buttons("Btn_2/Frme_1", quit, row=0, column=1)

frame_2 = MyFrame(window, row=1, column=0, sticky="news", color="green")
frame_2.buttons("Btn_1/Frme_2", quit, row=0, column=0)
frame_2.buttons("Btn_2/Frme_2", quit, row=0, column=1)

window.grid_columnconfigure(0, weight=1)
window.grid_columnconfigure(1, weight=1)
window.grid_rowconfigure(1, weight=1)
window.grid_rowconfigure(0, weight=1)

window.mainloop()

Теперь я думаю, что Моя проблема во время __init__ method, потому что должно быть 2 кадра и 2 кнопки на кадр. Тем не менее, нет ошибок, которые затрудняют выяснить наверняка, поэтому существуют только самые последние кнопки и рамки. Я даже не думаю, что это случай, когда один кадр или виджет «покрывают» другой. Я думаю, что второй кадр / виджеты кажутся перезаписывающими первый кадр / виджеты.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 марта 2020

Проблема заключается в вашей функции layout. Оба кадра grid редактируются в row=0 и column=0, так как вы не передаете указанную строку и столбец c в функцию. Следовательно, можно видеть перезапись кадров.

Другая проблема ( возможная ) в вашем коде заключается в том, что кнопки frame_1 и frame_2 не принадлежат к Frame виджету, но к root window

...