Python tkinter帧显示基础
我正在尝试用Python/tkinter创建一个应用程序(这是我的第一个应用程序),它最终应该运行在一个带有小触摸屏(480x320px)的Raspberry Pi上。屏幕分为一个主机和一个框架(稍后)将包含6个功能键(按钮) 所以我从下面的代码开始,希望/期望我能将主应用程序窗口分为两个框架,一个是灰色的,一个是黑色的。。。但我(在我的电脑上)看到的只是大小正确的主应用程序窗口,不可调整大小,标题正确(到目前为止还不错!),背景为黄色。。。我在MainApp中定义的框架似乎没有显示出来,尽管里面有标签,但它们是粘性的,它们有重量(我记不起我还尝试了什么,我还搜索了哪里) 请问我在这里俯瞰什么Python tkinter帧显示基础,python,tkinter,Python,Tkinter,我正在尝试用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
,那是一个小错误。我本可以使用网格
,但这需要三行而不是一行,没有额外的好处。