Проблемы с размещением фреймов с помощью tkinter python (фрейм внутри фрейма делает родительский фрейм невидимым)

Я использую python для создания небольшого приложения (для личного использования/обучения), и у меня возникают проблемы с пониманием того, как работает модуль фрейма из tkinter. Все, что я сделал до сих пор, это попытался разместить цветные квадраты, чтобы визуально «отобразить» окно, но у меня уже возникли проблемы.

  • Я установил зеленую рамку «основного» окна (размер 600 * 400, изменяемый размер)
  • рамка-контейнер желтого цвета (600*400, чтобы она покрывала все окно и чтобы мы могли видеть зеленый фон главного окна при изменении размера окна)
  • и третий кадр синего цвета, содержащийся в желтом (450*400)

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

import tkinter

class leftFrame(tkinter.Frame):
    def __init__(self, parent):
        self.frame = tkinter.Frame(parent, width=450, height=400, bg = "blue")
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.frame.grid()
        #if I comment this previous line, the yellow frame will be printed
        #pass


class mainFrame(tkinter.Frame):
    def __init__(self, master=None):
        self.frame = tkinter.Frame(master, width=600, height=400, bg = "yellow")
        self.master = master
        self.initialize()

    def initialize(self):
        self.frame.grid()
        self.left = leftFrame(self.frame)


root = tkinter.Tk()
root.geometry("600x400")
root.wm_title("Tkinter test")
root.configure(bg = "green")
#root.resizable(False, False)

app = mainFrame(root)

root.mainloop()

Я использовал классы для обработки своих «объектов макета», поскольку это казалось более чистым способом сделать это, но, поскольку я новичок в программировании на питоне и объектах, есть вероятность, что я сделал что-то не так, если кто-то хочет объяснить мне, почему это немного кода не работает, это было бы большим подспорьем! Спасибо ;)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Фон вашего корня оказывается закрытым двумя кадрами, которые вы вставляете.
Я предлагаю следующее:

-> была вставлена ​​метка-заполнитель для смещения внутренних рамок, чтобы вы могли видеть цвет фона корня.

import tkinter as tk


class InnerFrame(tk.Frame):
    """A tk.Frame to be inserted in a container
    """ 
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)
        self.master = master


class MainFrame(tk.Frame):
    """Container for two InnerFrame
    """
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.left_frame = InnerFrame(self, width=450, height=400, bg = "blue")
        self.left_frame.grid(row=0, column=0)
        self.right_frame = InnerFrame(self, width=450, height=400, bg = "green")
        self.right_frame.grid(row=0, column=1)


class App(tk.Tk):   # NOTE: not a tk.Frame
    """A tk.root that contains the entire GUI app
    """
    def __init__(self, title, color, width, height):
        super().__init__()
        self.title(title)
        self.configure(bg=color)
        self.geometry(f'{width}x{height}')

        self.placeholder_label = tk.Label(self, text='placeholder')
        self.placeholder_label.grid(row=1, column=0)

        self.mainframe = MainFrame(self)
        self.mainframe.grid()


# create and launch
App(title='Tkinter test', color='yellow', width=900, height=400).mainloop()

аспект на OSX:

Большое спасибо, это было очень полезно :)

p2121 06.04.2019 13:26

Другие вопросы по теме