tkinter框架显示基础知识

2024-09-29 22:06:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python/tkinter创建一个应用程序(这是我的第一个),它最终应该运行在一个带有小触摸屏(480x320px)的覆盆子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

Tags: selfmaincolumnrootframetkgridparent
2条回答

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

第一个问题是您忽略了向主窗口添加MainApp。你创造了它,但你没有在屏幕上显示出来。在

所以,第一步就是把它添加到主窗口。通过在创建后调用packplacegrid来完成此操作。由于它是根窗口内唯一的小部件,pack是最简单的:

app.pack(fill="both", expand=True)

这将使MainApp及其所有子级可见。在

第二个问题是,你会注意到所有的东西都被压缩到了窗口的左侧。这是因为您使用gridmainframe放在MainApp内,但是没有给MainApp中的任何列一个权重,因此窗口中所有多余的空间都将不被使用。而且,因为框架想要缩小以适应其内容,所以您的mainframe框架会水平收缩以适合其中的一个小部件。在

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

为此,请调用columnconfigure,就像您调用grid_rowconfigure

^{pr2}$

这样,mainframe现在覆盖了窗口的整个上部,fkeyframe覆盖了底部,您可以开始添加更多的小部件。在

__init__中使用frame.grid_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)

相关问题 更多 >

    热门问题