使用Python Tkinter布局框架的困扰(框架内嵌框架导致父框架不可见)

3
我正在使用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和面向对象编程不熟悉,所以很可能我在那里做错了什么。如果有人能解释一下为什么这段代码不起作用,那将是一个很大的帮助!谢谢;)

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上的方面:

enter image description here


1
非常感谢,这非常有帮助 :) - p2121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接