Python 减少屏幕大小时,避免状态栏(页脚)在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

我使用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()

我建议您切换到
网格
布局,因为您可以配置行和列。可以使用
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
。先生,完美的答案是:代码的最小更改和一些有用的建议。非常感谢。