调整Tkinter窗口大小以实现全屏显示

3

我知道有很多像这样的帖子。然而,我认为我没有看到过一个问题类似于这个。

我知道以下代码可以获取屏幕的当前宽度和高度,并将tkinter窗口设置为该大小,如果我们想要一个画布,也可以类似地设置画布的大小。

import tkinter as tk
root = tk.Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry("%dx%d" % (width, height))
canvas = tk.Canvas(root, .....)
canvas.pack(fill = "both", expand = True)

然而,使用这个时,我发现 tkinter 窗口总是有一部分被屏幕底部的任务栏挡住了。如果你希望在底部显示标签或其他功能,这可能会有些烦人。有没有什么方法可以避免这种情况?我知道我们可以从高度中减去一个偏移量来考虑屏幕底部可能存在的任务栏,但这会让 tkinter 画布变得不协调。

你在哪个平台上?我猜不是Mac,而是Windows 7、Windows 8、Ubuntu等吧? - abarnert
抱歉,我应该说明一下这是针对Windows 7的,但我认为适用于Windows 8。 - user4746908
在Windows上,据我所知,Tkinter没有直接获取此信息的方法。但是,如果您将窗口状态设置为“最大化”而不是显式地全屏,它会为您选择正确的大小。让我试着找出详细信息。 - abarnert
或者试试这个,万一我记得对的话:root.state("zoomed") 或者 root.state("zoom") - abarnert
实际上,那个方法非常有效。我使用了root.state("zoom")。这比我预期的要简单得多。 - user4746908
1个回答

3
我相信在Windows的Tkinter中无法实际获取任务栏信息。
但是你不必这样做。如果将主窗口的状态设置为“最大化”,Tkinter将要求Windows将您的窗口最大化,并处理与任务栏的适配,以及处理任何其他奇怪的装饰,处理自动隐藏任务栏等等。
root.state('zoomed')

据我所知,Tkinter没有记录这个值(Tkinter书中的state文档仅允许使用“normal”,“iconic”,“withdraw”和“icon”)。
但是,通常情况下,如果您查阅Tcl/Tk文档,您会发现Tkinter的文档不完整。即使在教程中,它也提到:
大多数系统上,您可以通过将窗口图标化来暂时将其从屏幕上删除。在Tk中,窗口是否被图标化是指窗口的状态。窗口的可能状态包括“正常”和“图标化”(对于已图标化的窗口),以及其他几种:“撤回”,“图标”或“缩放”。
Tk 参考文献wm state进行了说明:

...可以是正常的、图标化的、撤回的、图标或(仅限于Windows和Mac OS X)缩放。

此外,如果我没记错的话,您可以使用“zoom”来代替“zoomed”(还可以使用“withdraw”来代替“withdrawn”,“iconified”或“iconify”来代替“iconic”,以及“iconwindow”来代替“icon”),但Tk试图保持不一致的友好性。


虽然 root.state('zoomed') 在这里绝对是正确的答案,但实际上也有一种方法可以使用 win32apiGetMonitorInfo() 获取 Windows 上除任务栏外屏幕的大小,它提供了屏幕 "工作区" 的信息。我已经在回答 这个问题 中使用了它。请注意,仅减去部分高度以补偿任务栏仍然不会得到期望的结果(除非使用 overrideredirect),因为窗口的边框仍然围绕着指定的尺寸。 - fhdrsdg
@fhdrsdg:是的,这就是我说“从Tkinter内部”时的原因。有一个完整的MSDN页面介绍了模拟最大化模式的正确方法,而不必处于最大化模式,并且您绝对可以使用pywin32(或只需ctypes,如果您宁愿编写更丑陋的代码而不需要额外的依赖项)。 - abarnert
啊,我漏掉了那部分。我同意从Tkinter来看这是不可能的。你有没有那个MSDN页面的链接?尽管我可能永远不会用到它,但我想读一下。 - fhdrsdg
1
@fhdrsdg:没有链接;我只知道它的存在是因为很多年前(2000/XP时代),我曾经开发过一个任务栏替换应用程序,必须让所有相同的API都能正常工作,而我很高兴他们已经记录了一切。(虽然我想这只是证明它曾经存在过,而不是它现在仍然存在……但我的经验是,微软并不像某些公司咳咳苹果咳咳那样毫无理由地消除旧文档。) - abarnert
没问题,无论如何还是谢谢。我会继续搜索,希望它还在。 - fhdrsdg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接