首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取tkinter窗口标题栏的高度

如何获取tkinter窗口标题栏的高度
EN

Stack Overflow用户
提问于 2019-09-01 00:32:12
回答 3查看 2.5K关注 0票数 8

我试图找出如何获得一个tkInter窗口标题栏的高度,但似乎找不到任何信息,它是如何做到的。

我尝试过使用root.geometry(),而且root.geometry()似乎只返回窗口内容的大小,而不返回带有标题栏和边框大小的窗口的总大小。我见过其他人说,你需要向操作系统要这些东西。我希望避免这种情况,因为这将使代码平台更难独立。必须有一种方法来做到这一点,而不去操作系统的这一点。有人知道我必须怎么做才能得到这个信息吗?

My system:

OS: Linux

KDE血浆: 5.16.4

KDE框架: 5.61.0

代码语言:javascript
运行
复制
import tkinter

root = tkinter.Tk()
root.geometry("250x250+100+100")
root.update_idletasks()

print('root.winfo_x() = ', root.winfo_x())
print('root.winfo_y() = ', root.winfo_y())
print('root.geometry() = ', root.geometry())

root.mainloop()

测试代码结果:

代码语言:javascript
运行
复制
    root.winfo_x() =  100
    root.winfo_y() =  100
    root.geometry() =  250x250+100+100

使用屏幕尺应用程序测量窗口的高度是:

代码语言:javascript
运行
复制
x=102, y=286
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-29 01:56:37

我终于弄明白了。为了获得标题栏的高度,我首先向窗口添加了一个框架,并设置了窗口的几何形状(‘1x1’)。我还必须使用update_idletasks()来更新tkinter内部数据。这样做后,我得到了正确的高度。不得不这样做似乎很奇怪,但它起了作用。下面是我用来获得高度的代码。在Windows和Linux中进行测试和工作。如果有人知道更正确的方法,我肯定想知道。另外,如果有人在使用苹果,请告诉我下面的代码是否有效。

更新:我已经更新了代码,并在(Linux、和MacOS)中进行了测试,以给出正确的标题栏高度。我认为这是最好的方法,因为你不需要使操作系统依赖的系统calls.But,我不知道它是否可以工作的任何缩放级别。

更新:现在可以用于任何缩放级别。(在windows 10,windows 7中通过的测试)

代码语言:javascript
运行
复制
import tkinter as tk
from sys import platform


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        tk.Frame(self).update_idletasks()
        self.geometry('350x200+100+100')
        self.update_idletasks()

        offset_y = 0
        if platform in ('win32', 'darwin'):
            import ctypes
            try: # >= win 8.1
                ctypes.windll.shcore.SetProcessDpiAwareness(2)
            except: # win 8.0 or less
                ctypes.windll.user32.SetProcessDPIAware()
            offset_y = int(self.geometry().rsplit('+', 1)[-1])

        bar_height = self.winfo_rooty() - offset_y
        print(f'Height: {bar_height}\nPlatform: {platform}')
        #  self.destroy()


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()
票数 3
EN

Stack Overflow用户

发布于 2020-04-29 08:13:21

标题栏(默认)是一个系统setting.As,据我所知,它取决于许多因素。(系统缩放比,不同的操作系统,新闻部意识等)。

在窗口中,改变缩放比会得到不同的高度值。

关于这个问题: tkinter将在windows中被识别为一个老软件,您需要设置DPI意识,使其具有系统正常高度(如果系统缩放比不是100%,则适合系统缩放比率)。

正常情况下,系统标题栏的高度是相同的:但有些例外(我不太了解winapi),不同的新闻部意识会显示出标题栏的不同高度:

同样:

为了使它们相同并得到标题栏的正常高度:

代码语言:javascript
运行
复制
import tkinter
import ctypes

ctypes.windll.shcore.SetProcessDpiAwareness(2)
print(ctypes.windll.user32.GetSystemMetrics(4))
root = tkinter.Tk()

root.mainloop()

结果:

参考: MSDN:GetSystemMetrics新闻部的认识(新闻部认识的价值)。

票数 7
EN

Stack Overflow用户

发布于 2021-03-27 14:14:01

更简单的方法是在第一次设置几何图形之后测试self.winfo_y()是如何改变的,然后对这个变化进行修正。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57742442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档