【问题标题】:How to set my widgets' size and padding dynamically to fit window in Tkinter?如何动态设置我的小部件的大小和填充以适应 Tkinter 中的窗口?
【发布时间】:2020-11-11 17:15:39
【问题描述】:

我是 Tkinter 的新手,还在学习。我的桌面分辨率是 1366x768,我正在为 2048x768 的环境进行开发。现在我正在通过像这样检测它来设置窗口分辨率 -

w = main_container.winfo_screenwidth()
h = main_container.winfo_screenheight()
main_container.geometry(str(w) + "x" + str(h))

现在我有几个屏幕,我不能在每个屏幕上都使用网格。就像我有一个登录屏幕,其中有一个这样的框架-

self.frame_background = tk.Frame(self.frame_parent, bg='#ffffff')
self.frame_background.pack(fill='both', expand=True, padx=100,
                               pady=100)

这只是一个小部件的示例。由于 padx 和 pady 的值固定为 100,如果我在 640x480 分辨率的设备上运行我的应用程序,布局会变得过于拉伸,并且在此框架内几乎看不到任何东西。 如何根据屏幕大小和分辨率动态设置这些 padx 和 pady 以及其他宽度和高度值?

【问题讨论】:

  • 类似padx=0.05*wpady=0.1*h?
  • 为什么要将 padx 和 pady 设置为如此庞大的数字?您是否猜测这足以使小部件适合屏幕?您是否尝试过使用其他包选项,例如 fill="both"
  • @acw1668 你能解释一下你是如何得出这些值 0.05 和 0.1 的吗?
  • 这只是一个例子,您需要根据自己的情况调整值。
  • 完全不清楚你在问什么。请edit 包含minimal reproducible example 的代码。很难说出“比例”是什么意思——你想让字体变大和变小吗?一块可以增长或缩小的画布?按钮边框变宽变窄?还有什么?

标签: python python-3.x tkinter


【解决方案1】:

现在我有几个屏幕,我不能在每个屏幕上都使用网格。

你为什么不能?没有什么能阻止您在每个屏幕上使用grid。不过,在不同的帧中混合和匹配 packgrid 实际上很常见,并且可以说是最佳实践。

就像我有一个登录屏幕,其中我有一个这样的标签...

该语句后面的代码没有Label,因此很难知道您要做什么。

如果我在 640x480 上运行我的应用程序...

首先您说您的桌面分辨率为 1366x768,然后说您的目标是 2048x768,现在询问的是 640x480。这是一个相当广泛的值。如果您必须支持低至 640x480 的内容,那么您绝对不应该将填充硬编码为如此巨大的值。通常填充从不超过一两个。 Tkinter 应用可以适应各种屏幕尺寸,但这依赖于尽可能硬编码小部件的尺寸和填充。

如何根据屏幕尺寸和分辨率动态设置这些 padx 和 pady 以及其他宽度和高度值?

一般来说,您不应该这样做。 tkinter 的一般经验法则是,您将小部件设为所需的最小尺寸,并让几何管理器担心拉伸或收缩它们以适应可用空间。该规则有一些例外,但总的来说,该规则运作良好。

很遗憾,如果您不了解您正在尝试做什么,就很难回答几何管理问题。例如,我们需要知道为什么您认为您需要 100 像素的填充。这似乎非常不寻常。另外,我们需要知道你的框架里还有什么,你的框架里有什么,等等。

我的建议是删除填充,或者将它们设置为非常小的值。然后,确保使用所有可用的几何管理器选项,例如fillexpandpack,以及sticky 和其他grid

【讨论】:

  • 实际上我正在为不同的客户制作一个可以在多种终端上运行的游戏,因此这些终端对于不同的客户会有不同的尺寸。我想制作一些动态的东西,以便小部件自动缩放,并且就不使用网格而言,在我之前在这个项目上工作的人已经使用包而不是网格制作了所有以前的游戏,我不想重做再次完成所有工作并将其更改为网格。是否有任何解决方法可以支持不同的屏幕分辨率,以便小部件自动缩放?
  • @AmanGrover:说你不想要使用网格不同于说你不能使用网格。不管怎样,gridpack 都可以用来制作响应式 UI。你将不得不在你的问题更具体。完全不清楚您所说的“规模”是什么意思,以及为什么不能只使用 gridpack 的选项来使您的 UI 响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多