我使用tkinter开发了一个非常大的GUI。
调整大小时一切都很好,除了减少窗口高度的情况。所有帧都使用' pack()'。
GUI的基本垂直结构是(从上到下排序):
工具栏框架
self.frame_Toolbar=Frame(self.root, bg=colorBackground)
self.frame_Toolbar.pack(side=TOP, fill=X)
包含所有基本信息的中间框架
self.frame_Middle=Frame(self.root)
self.frame_Middle.pack(side=TOP, fill=BOTH, expand=YES)
状态栏
self.frame_Status=Frame(self.root, bg=colorStatus, bd=1, relief=SUNKEN)
self.frame_Status.pack(side=BOTTOM, fill=X)
如果窗口调整大小,中间框架会被放大,这很好,因为它是我想要的。
问题在于,当减少窗口的高度时,状态栏会消失,因为中间框架适应内部窗口小部件。但是,我希望状态栏和工具栏都能得到维护,即使隐藏了一些小部件,中间框架也会减少所需的数量。
总而言之,我希望工具栏和状态栏都具有最小高度。
这可能吗?
编辑:我添加了具有相同错误的功能性MCVE代码
# Import graphical interface
from tkinter import *
# Fixed window
root_fw=Tk()
# Toolbar
frame_Toolbar=Frame(root_fw, bg='red', height=50)
frame_Toolbar.pack(side=TOP, fill=X)
# Middle
frame_Middle=Frame(root_fw, bg='blue', height=300)
frame_Middle.pack(side=TOP, fill=BOTH, expand=YES)
# Status bar
frame_Status=Frame(root_fw, bg='green', bd=1, relief=SUNKEN, height=20)
frame_Status.pack(side=BOTTOM, fill=X)
root_fw.mainloop()
答案 0 :(得分:2)
一旦所有小部件都达到最小大小,当缩小窗口时,tkinter必须开始减小一个或多个小部件的大小。它按照小部件在堆叠顺序中出现的顺序执行此操作。简单地说,它开始从最后一个打包的小部件中删除空间。
因此,简短的回答是在打包中间窗口小部件之前打包状态栏。一般来说,GUI会有一个占据大部分空间的“英雄”小部件;应该最后打包这个窗口,以便在调整窗口大小时不会剪裁其他窗口小部件。
我的建议是始终将窗口小部件创建与窗口小部件布局分开,并将布局组合在一起。我发现这种做法使布局问题更容易解决。因此,我会修改您的代码,如下所示:
from tkinter import *
root_fw=Tk()
frame_Toolbar=Frame(root_fw, bg='red', height=50)
frame_Middle=Frame(root_fw, bg='blue', height=300)
frame_Status=Frame(root_fw, bg='green', bd=1, relief=SUNKEN, height=20)
frame_Toolbar.pack(side=TOP, fill=X)
frame_Status.pack(side=BOTTOM, fill=X)
frame_Middle.pack(side=TOP, fill=BOTH, expand=YES)
root_fw.mainloop()
答案 1 :(得分:1)
我建议您切换到Grid
布局,因为您可以配置行和列。可以使用minsize
方法的rowconfigure
选项设置行的最小高度。
此外,您需要将中间行配置为通过将其weight
设置为1来调整窗口大小,最后您可以将窗口的最小大小设置为至少足以显示两个小节。
from tkinter import *
# Fixed window
root_fw = Tk()
# resize row 1 and column 0 with window
root_fw.rowconfigure(1, weight=1)
root_fw.columnconfigure(0, weight=1)
# set minimum height for row 0 and 2
root_fw.rowconfigure(0, minsize=50)
root_fw.rowconfigure(2, minsize=20)
# set window min size
root_fw.minsize(70, 70)
# Toolbar
frame_Toolbar = Frame(root_fw, bg='red', height=50, width=200)
frame_Toolbar.grid(row=0, sticky="ew")
# Middle
frame_Middle = Frame(root_fw, bg='blue', height=300, width=200)
frame_Middle.grid(row=1, sticky="ewsn")
# Status bar
frame_Status = Frame(root_fw, bg='green', bd=1, relief="sunken", height=20, width=200)
frame_Status.grid(row=2, sticky="ew")
root_fw.mainloop()