此网站上有很多问题询问 tkinter 中标题栏或任务栏的高度。
通常答案是“否”,或者存在对窗口管理器的特定于平台的调用。
所以这个问题是关于如何通过跨平台方式获取这些值的解决方法。
有人有答案吗?
示例:
如何获取 tkinter 窗口标题栏的高度
Python/tkinter - 如何获取 Windows 上的窗口大小(包括边框)?
如何创建一个新的 python tkinter 窗口,使其完全适合可用桌面区域,但未最大化?
您可以使用这个公式,它利用了窗口管理器将通过“最大化”窗口来适当调整窗口大小的事实。通过将框架跨越到客户区域,您可以获得客户端,您可以测量从屏幕坐标中的客户区域 y 点到屏幕坐标中窗口的 y 点。因此你可以得到标题栏的高度,并能够计算出桌面工作区域的点,从而可以计算任务栏。 通过使用wax1和way1,这个小脚本试图解决具有多个屏幕的可能性。然而,此脚本仅在 Windows11 和单个显示器上进行了测试。
最后的 3 个矩形具有
(x1,y1, width, height)
的形式,这在 tkinter 中很常见。
import tkinter as tk
import sys
root = tk.Tk()
f = tk.Frame(root, bg='orange')
f.place(relwidth=1,relheight=1, relx=0,rely=0)
if sys.platform == "win32":
root.state('zoomed')
else:
root.wm_attributes('-zoomed', True)
root.update()
bd = borderwidth = root.winfo_rootx()-root.winfo_x()
tbh = titlebarheight = f.winfo_rooty()-root.winfo_y()-bd
wax1 = working_area_x1 = root.winfo_x()+bd
way1 = working_area_y1 = root.winfo_rooty()-tbh
wax2 = working_area_x2 = wax1+root.winfo_width()
way2 = working_area_y2 = way1+root.winfo_height() + tbh
waw = working_area_width = wax1+root.winfo_width() - wax1
wah = working_area_height = way1+root.winfo_height() - way1 + tbh
if root.winfo_screenheight()-wah:
tko = taskbar_offset = root.winfo_screenheight()-wah
if way2+tko == root.winfo_screenheight():
tkrect = wax1,way2,waw,tko
screct = wax1,way1,waw,way2+tko
else:#up
tkrect = wax1,way1-tko,waw,tko
screct = wax1,way1-tko,waw,way2
elif root.winfo_screenwidth()-waw:
tko = taskbar_offset = root.winfo_screenwidth()-waw
if wax2+tko == root.winfo_screenwidth():
tkrect = wax2,way1,tko,wah
screct = wax1,way1,wax2+tko,wah
else:#left
tkrect = wax1-tko,way1,tko,wah
screct = wax1-tko,way1,wax2,wah
tkrect = taskbar_rect = tkrect
warect = working_area_rect = wax1, way1, waw, wah
screct = screen_rect = screct
if sys.platform == "win32":
root.state('normal')
else:
root.wm_attributes('-zoomed', False)
print(tkrect, warect, screct)
root.mainloop()