Python / tkinter - 如何在Windows上获得包含边框的窗口大小?

时间:2015-10-20 08:18:46

标签: python windows tkinter tk

我试图根据窗口的宽度和高度来定位窗口。在Windows上,wm_geometrywinfo_widthwinfo_height报告的窗口大小是客户区的大小,即没有边框的窗口大小。 wm_geometrywinfo_xwinfo_y报告的窗口位置以及使用wm_geometry设置的位置是窗口左上角的位置< em>包括边界。

这意味着当我尝试将窗口置于屏幕中央时,屏幕上的位置明显太低。

我不想对边框厚度进行硬编码,因为它可能会有所不同。

是否可以使用Python / tkinter在Windows上获取或推断窗口边框的大小?

2 个答案:

答案 0 :(得分:5)

来自http://wiki.tcl.tk/11291

wm geometry .返回contentsWidthxcontentsHeight + decorationTop + decorationLeftEdge。

winfo rooty .返回contentsTop 并winfo rootx .返回contentsLeftEdge

通过这些,您可以计算标题栏高度和左边框宽度(通常与右边框宽度和下边框宽度匹配)。这应该适用于Windows,但不一定适用于所有平台。由于链接页面也会检查,因此在确定由于Windows任务栏而可用的屏幕区域的总高度和宽度时也存在问题。

答案 1 :(得分:0)

正如我们在评论中所讨论的那样,我怀疑你是否可以使用纯tkinter来做到这一点。

我尝试使用win32gui实现获取窗口大小(包括边框)的解决方案。根据这些信息,您应该能够实现其余功能。不幸的是,这仅适用于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()来对所有可用的窗口进行交互以找到具有正确标题的窗口。然后,我可以使用win32gui.GetWindowRect()来获取大小。

我会将win32gui和tkinter的结果打印到控制台进行比较。