首页 文章

tkinter框架显示基础知识

提问于
浏览
1

我正在尝试在Python / tkinter中创建一个应用程序(我的第一个),最终应该在Raspberry Pi上运行,并附带一个小型触摸屏显示器(480x320px) . 屏幕分为主机和框架,后面将包含6个功能键(按钮)

所以我从下面的代码开始,希望/期望以某种方式我将主应用程序窗口分为两个框架,一个是灰色,一个是黑色...但我看到的(在我的PC上)是正确大小的MainApp窗口,没有可调整大小,正确的 Headers (到目前为止很好!)和黄色背景......似乎我在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

2 回答

  • 0

    __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)
    
  • 2

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

    第一个问题是你忽略了将 MainApp 添加到主窗口 . 你创建它,但不要在屏幕上显示它 .

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

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

    这将导致 MainApp 及其所有孩子都可见 .

    第二个问题是你会注意到现在所有东西都被压缩到了窗口的左侧 . 这是因为你将 mainframe 放在 MainAppgrid ,但是你没有给 MainApp 中的任何一个权重,所以整个窗口中的所有额外空间都没有用完 . 并且,由于帧要缩小以适合其内容,因此 mainframe 框架会水平缩小以适合其中的一个窗口小部件 .

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

    要做到这一点,请调用 columnconfigure ,就像你调用 grid_rowconfigure 一样:

    self.columnconfigure(0, weight=1)
    

    有了它,你的 mainframe 现在覆盖了窗口的整个上半部分, fkeyframe 覆盖了底部,你可以开始添加更多的小部件 .

相关问题