Python tkinter帧显示基础

Python tkinter帧显示基础,python,tkinter,Python,Tkinter,我正在尝试用Python/tkinter创建一个应用程序(这是我的第一个应用程序),它最终应该运行在一个带有小触摸屏(480x320px)的Raspberry Pi上。屏幕分为一个主机和一个框架(稍后)将包含6个功能键(按钮) 所以我从下面的代码开始,希望/期望我能将主应用程序窗口分为两个框架,一个是灰色的,一个是黑色的。。。但我(在我的电脑上)看到的只是大小正确的主应用程序窗口,不可调整大小,标题正确(到目前为止还不错!),背景为黄色。。。我在MainApp中定义的框架似乎没有显示出来,尽管里

我正在尝试用Python/tkinter创建一个应用程序(这是我的第一个应用程序),它最终应该运行在一个带有小触摸屏(480x320px)的Raspberry Pi上。屏幕分为一个主机和一个框架(稍后)将包含6个功能键(按钮)

所以我从下面的代码开始,希望/期望我能将主应用程序窗口分为两个框架,一个是灰色的,一个是黑色的。。。但我(在我的电脑上)看到的只是大小正确的主应用程序窗口,不可调整大小,标题正确(到目前为止还不错!),背景为黄色。。。我在MainApp中定义的框架似乎没有显示出来,尽管里面有标签,但它们是粘性的,它们有重量(我记不起我还尝试了什么,我还搜索了哪里)

请问我在这里俯瞰什么

#!/usr/bin/python3
import tkinter as tk
#
# main application
#
class MainApp(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("My first GUI")
        self.parent.geometry("480x320")
        self.parent.resizable(width=False, height=False)
        self.parent.config(bg="yellow")

        mainframe = tk.Frame(self, bg="grey", width=480, height=280 )
        mainframe.grid(column=0, row=0, sticky="WENS")
        tk.Label(mainframe, text="co-cooo").grid(column=0, row=0, sticky="WENS")

        fkeyframe = tk.Frame(self, bg="black", width=480, height=40)
        fkeyframe.grid(column=0, row=1, sticky="WENS")
        tk.Label(fkeyframe, text="fo-fooo").grid(column=0, row=0, sticky="WENS")

        self.rowconfigure(0, weight=1, minsize=280)
        self.rowconfigure(1, weight=1, minsize=40)
#
# define root element and start application
#
def main():
    root = tk.Tk()
    app = MainApp(root)
    root.mainloop()  

#
# start if called from command line
#
if __name__ == '__main__':
    main()

#      0,0   MainApp (yellow)          480,0
#       +---------------------------------+
#       |   mainframe (grey, h=280)       |
#       |+-------------------------------+|
#       ||                               ||
#       ||                               ||
#       ||                               ||
#       |+-------------------------------+|
#       |   fkeyframe  (black, h=40)      |
#       |+-------------------------------+|
#       ||+----+----+----+----+----+----+||
#       ||| Bt | Bt | Bt | Bt | Bt | Bt |||
#       ||+----+----+----+----+----+----+||
#       |+-------------------------------+|
#       +---------------------------------+
#    320,0                             320,480

\uuuu init\uuuu
中使用
frame.grid\u propagate(False)
以防止将框架大小调整为内部小部件的尺寸:

def __init__(self, parent):
    tk.Frame.__init__(self, parent)
    self.parent = parent
    self.parent.title("My first GUI")
    self.parent.geometry("480x320")
    self.parent.resizable(width=False, height=False)
    self.parent.config(bg="yellow")

    mainframe = tk.Frame(self, bg="grey", width=480, height=280 )
    mainframe.grid(column=0, row=0, sticky="WENS")
    mainframe.grid_propagate(False)
    tk.Label(mainframe, text="co-cooo").grid(column=0, row=0, sticky="WENS")

    fkeyframe = tk.Frame(self, bg="black", width=480, height=40)
    fkeyframe.grid(column=0, row=1, sticky="WENS")
    mainframe.grid_propagate(False)
    tk.Label(fkeyframe, text="fo-fooo").grid(column=0, row=0, sticky="WENS")

    self.rowconfigure(0, weight=1, minsize=280)
    self.rowconfigure(1, weight=1, minsize=40)

你在正确的轨道上。我看到你是有条不紊的,一次只解决一个布局问题,而不是把你所有的小部件放在屏幕上,然后试图修复它们。这绝对是你开始工作时最好的方式

第一个问题是您忽略了将
MainApp
添加到主窗口。您创建了它,但没有在屏幕上显示它

因此,第一步是将其添加到主窗口。创建后,通过调用
pack
place
grid
来执行此操作。由于它是根窗口中唯一的小部件,
pack
是最简单的:

app.pack(fill="both", expand=True)
这将导致
MainApp
及其所有子项可见

第二个问题是,您会注意到现在所有内容都被压缩到窗口的左侧。这是因为您将
MainApp
grid
放在
MainApp
的内部,但没有为
MainApp
中的任何列赋予权重,因此整个窗口中的所有额外空间都未使用。而且,由于框架希望收缩以适应其内容,因此大型机框架水平收缩以适应其内部的一个小部件

根据经验,如果将一个或多个小部件放入父小部件中,则必须始终为父小部件中的至少一行和一列赋予权重

为此,请调用
columnconfigure
,就像调用
grid\u rowconfigure

self.columnconfigure(0, weight=1)

这样,您的
大型机
就可以覆盖整个窗口的上部,而
fkeyframe
则覆盖底部,您可以开始添加更多的小部件。

部分改进。。。现在我看到灰色和黑色,在主应用程序窗口的最左边有重叠的标签co cooo和fo fooo,其余的(约80%)在右边仍然是黄色。。。所以框架似乎不尊重我所要求的宽度更新的答案,看看框架的
grid\u propagate
方法。我开始减少我认为是多余的代码,所以
self.grid()
实际上做了一些非常好的事情。。。我现在遇到了新的现象,所以我接受你的答案,当frust级别提高到10^6以上时打开另一个。grid_propagate(False)杀死了更多的现象。。。感谢您对答案的评论,您解决了一个问题,但又制造了其他问题。这正是禁用传播时发生的情况。它修复了一个直接的问题,但会导致其他问题。在我看来,在这个特定的案例中,关闭传播修复了一个症状,而不是一个问题。至于我使用的
pack
,那是一个小错误。我本可以使用
网格
,但这需要三行而不是一行,没有额外的好处。