Python 减少屏幕大小时,避免状态栏(页脚)在GUI中消失
我使用tkinter开发了一个相当大的GUI 调整大小时一切都很好,除了大幅降低窗口高度的情况。使用“pack()”放置所有框架 GUI的基本垂直结构是(从上到下排列):Python 减少屏幕大小时,避免状态栏(页脚)在GUI中消失,python,tkinter,Python,Tkinter,我使用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.fra
- 工具栏框架
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)
# 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()
我建议您切换到
网格
布局,因为您可以配置行和列。可以使用rowconfigure
方法的minsize
选项设置行的最小高度
此外,您需要通过将中间行的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()
一旦所有小部件都达到最小大小,当您缩小窗口时,tkinter必须开始减小一个或多个小部件的大小。它按照窗口小部件在堆叠顺序中出现的顺序执行此操作。简单地说,它开始从最后一个打包的小部件中删除空间 因此,简单的答案是在打包中间的小部件之前打包statusbar。一般来说,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()
你能提供一个MCVE()来重现你的问题吗?对我们来说,测试代码和提供答案会更容易。我已经修改了问题,提供了一个相同问题的MCVE。谢谢你的回答。我投了赞成票,因为它非常有效,但我更喜欢Bryan Oakley的答案,因为需要的更改更少,而且我可以保留“pack()”方法。我理解,没问题。我更习惯于
grid
而不是pack
。先生,完美的答案是:代码的最小更改和一些有用的建议。非常感谢。