Python/tkinter - 如何获得 window 尺寸,包括 Windows 上的边框?
Python/tkinter - How do I get the window size including borders on Windows?
我正在尝试根据 window 的宽度和高度来定位我的 window。在 Windows 上,wm_geometry
、winfo_width
和 winfo_height
报告的 window 大小是 客户区 的大小,即没有边框的 window 大小。由wm_geometry
、winfo_x
和winfo_y
报告的window的位置以及使用wm_geometry
设置的位置是左上角的位置window包括边框。
这意味着当我尝试将 window 在屏幕上居中时,该位置在屏幕上明显太低了。
我不想对边框粗细进行硬编码,因为它可能会有所不同。
是否可以使用 Python/tkinter 获取或推断 Windows 上 window 边框的大小?
正如我们在评论中讨论的那样,我怀疑您是否可以使用纯 tkinter 来完成。
我已经尝试实现一个解决方案,以使用 win32gui 获取 window 大小(包括边框)。根据这些信息,您应该能够实现其余的功能。不幸的是,这仅适用于 Windows 平台并且需要在 pywin32 上安装。你可以得到它here。我敢肯定,如果需要的话,Mac 和 Linux 是等价的。
这是我的解决方案,在 Python 3.4:
中测试过
import tkinter as tk
import win32gui
class TestApp:
def __init__(self, master):
frame = tk.Frame(master)
frame.pack()
self.master = master
label = tk.Label(text='Test Label')
label.pack()
b1 = tk.Button(text='test', command=self.pressed)
b1.pack()
def pressed(self):
win32gui.EnumWindows(self.callback, None)
x = root.winfo_x()
y = root.winfo_y()
w = self.master.winfo_width()
h = self.master.winfo_height()
print('tkinter location: ({},{})'.format(x, y))
print('tkinter size: ({},{})'.format(w, h))
def callback(self, hwnd, extra):
if "Test title" in win32gui.GetWindowText(hwnd):
rect = win32gui.GetWindowRect(hwnd)
x = rect[0]
y = rect[1]
w = rect[2] - x
h = rect[3] - y
print('Window location: ({},{})'.format(x, y))
print('Window size: ({},{})'.format(w, h))
root = tk.Tk()
root.title("Test title")
app = TestApp(root)
root.mainloop()
我 win32gui.EnumWindows() 对所有可用的 windows 进行交互以找到具有正确标题的那个。从这里我可以使用 win32gui.GetWindowRect().
获得尺寸
我会将 win32gui 和 tkinter 的结果打印到控制台进行比较。
wm geometry .
returns contentsWidthxcontentsHeight+decorationTop+decorationLeftEdge.
和winfo rooty .
returns 内容顶部
和 winfo rootx .
returns contentsLeftEdge
从中您可以计算出标题栏高度和左边框宽度(通常与右边框和底边框宽度相匹配)。这应该适用于 windows,但不一定适用于所有平台。正如链接页面还检查的那样,由于 windows 任务栏,在确定可用屏幕区域的总高度和宽度方面也存在问题。
我正在尝试根据 window 的宽度和高度来定位我的 window。在 Windows 上,wm_geometry
、winfo_width
和 winfo_height
报告的 window 大小是 客户区 的大小,即没有边框的 window 大小。由wm_geometry
、winfo_x
和winfo_y
报告的window的位置以及使用wm_geometry
设置的位置是左上角的位置window包括边框。
这意味着当我尝试将 window 在屏幕上居中时,该位置在屏幕上明显太低了。
我不想对边框粗细进行硬编码,因为它可能会有所不同。
是否可以使用 Python/tkinter 获取或推断 Windows 上 window 边框的大小?
正如我们在评论中讨论的那样,我怀疑您是否可以使用纯 tkinter 来完成。
我已经尝试实现一个解决方案,以使用 win32gui 获取 window 大小(包括边框)。根据这些信息,您应该能够实现其余的功能。不幸的是,这仅适用于 Windows 平台并且需要在 pywin32 上安装。你可以得到它here。我敢肯定,如果需要的话,Mac 和 Linux 是等价的。
这是我的解决方案,在 Python 3.4:
中测试过import tkinter as tk
import win32gui
class TestApp:
def __init__(self, master):
frame = tk.Frame(master)
frame.pack()
self.master = master
label = tk.Label(text='Test Label')
label.pack()
b1 = tk.Button(text='test', command=self.pressed)
b1.pack()
def pressed(self):
win32gui.EnumWindows(self.callback, None)
x = root.winfo_x()
y = root.winfo_y()
w = self.master.winfo_width()
h = self.master.winfo_height()
print('tkinter location: ({},{})'.format(x, y))
print('tkinter size: ({},{})'.format(w, h))
def callback(self, hwnd, extra):
if "Test title" in win32gui.GetWindowText(hwnd):
rect = win32gui.GetWindowRect(hwnd)
x = rect[0]
y = rect[1]
w = rect[2] - x
h = rect[3] - y
print('Window location: ({},{})'.format(x, y))
print('Window size: ({},{})'.format(w, h))
root = tk.Tk()
root.title("Test title")
app = TestApp(root)
root.mainloop()
我 win32gui.EnumWindows() 对所有可用的 windows 进行交互以找到具有正确标题的那个。从这里我可以使用 win32gui.GetWindowRect().
获得尺寸我会将 win32gui 和 tkinter 的结果打印到控制台进行比较。
wm geometry .
returns contentsWidthxcontentsHeight+decorationTop+decorationLeftEdge.
和winfo rooty .
returns 内容顶部
和 winfo rootx .
returns contentsLeftEdge
从中您可以计算出标题栏高度和左边框宽度(通常与右边框和底边框宽度相匹配)。这应该适用于 windows,但不一定适用于所有平台。正如链接页面还检查的那样,由于 windows 任务栏,在确定可用屏幕区域的总高度和宽度方面也存在问题。