如何计算 tkinter 中窗口装饰/任务栏/标题栏的矩形

问题描述 投票:0回答:1

此网站上有很多问题询问 tkinter 中标题栏或任务栏的高度。
通常答案是“否”,或者存在对窗口管理器的特定于平台的调用。
所以这个问题是关于如何通过跨平台方式获取这些值的解决方法。

有人有答案吗?

示例:
如何获取 tkinter 窗口标题栏的高度
Python/tkinter - 如何获取 Windows 上的窗口大小(包括边框)?
如何创建一个新的 python tkinter 窗口,使其完全适合可用桌面区域,但未最大化?

tkinter tk-toolkit
1个回答
0
投票

您可以使用这个公式,它利用了窗口管理器将通过“最大化”窗口来适当调整窗口大小的事实。通过将框架跨越到客户区域,您可以获得客户端,您可以测量从屏幕坐标中的客户区域 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()

© www.soinside.com 2019 - 2024. All rights reserved.