【问题标题】:Avoid the status bar (footer) from disappearing in a GUI when reducing the size of the screen减少屏幕尺寸时,避免状态栏(页脚)在 GUI 中消失
【发布时间】:2017-02-06 18:23:21
【问题描述】:

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

【问题讨论】:

  • 您能否提供一个 MCVE (stackoverflow.com/help/mcve) 来重现您的问题?对我们来说,测试代码并提供答案会更容易。
  • 我已经修改了提供具有相同问题的 MCVE 的问题。

标签: python tkinter


【解决方案1】:

一旦所有小部件都达到最小尺寸,当您缩小窗口时,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()

【讨论】:

  • 先生,完美的答案:对代码的最小更改和一些有用的建议。谢谢!
【解决方案2】:

我建议您切换到Grid 布局,因为您可以配置行和列。可以使用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()

【讨论】:

  • 感谢您的回答。我投了赞成票,因为它非常有效,但我更喜欢 Bryan Oakley 的回答,因为需要的更改更少,而且我可以保留 'pack()' 方法。
  • 我明白,没问题。比起pack,我更习惯grid
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2016-05-12
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多