我正在尝试在Python / tkinter中创建一个应用程序(我的第一个),它最终应该在一个带有小型触摸屏显示器(480x320px)的Raspberry Pi上运行。屏幕分为主机和框架(后面)将包含6个功能键(按钮)
所以我开始使用下面的代码,希望/期望我将以某种方式将主应用程序窗口分为两个框架,一个是灰色的,一个是黑色的...但我看到的(在我的PC上)是MainApp窗口正确的大小,不可调整大小,正确的标题(到目前为止很好!)和黄色背景...似乎我在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
答案 0 :(得分:2)
你走在正确的轨道上。我看到你是有条不紊的,只是尝试一次解决一个布局问题,而不是试图将所有小部件放在屏幕上然后尝试修复它们。当你开始时,这绝对是最好的工作方式。
第一个问题是你忽略了将MainApp
添加到主窗口。您可以创建它,但不要在屏幕上显示它。
因此,第一步是将其添加到主窗口。通过在创建后调用pack
或place
或grid
来执行此操作。由于它是根窗口中唯一的小部件,pack
是最简单的:
app.pack(fill="both", expand=True)
这将导致MainApp
及其所有子项可见。
第二个问题是你会注意到现在所有东西都被压缩到了窗口的左侧。这是因为您将mainframe
放在MainApp
内grid
,但是您没有给MainApp
中的任何列赋予权重,因此窗口中的所有额外空格都是如此整体未使用。并且,由于帧要缩小以适合其内容,因此mainframe
帧会水平缩小以适合其中的一个窗口小部件。
根据经验,如果将一个或多个小部件放入父窗口小部件中,则必须始终对父窗口小部件中的至少一行和一列赋予权重。
为此,请致电columnconfigure
,就像致电grid_rowconfigure
:
self.columnconfigure(0, weight=1)
这样,您的mainframe
现在覆盖了窗口的整个上半部分,fkeyframe
覆盖了底部,您可以开始添加更多小部件。
答案 1 :(得分:0)
使用frame.grid_propagate(False)
中的__init__
来防止将框架尺寸调整为内部小部件的尺寸:
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)