暴躁的稀饭 · C#中Spli、正则表达式分解字符串详解 ...· 7 月前 · |
重情义的松鼠 · 如何把double类型的数据转换为int类型 ...· 10 月前 · |
曾深爱过的大白菜 · WindowsError: - ...· 1 年前 · |
我试图找出如何获得一个tkInter窗口标题栏的高度,但似乎找不到任何信息,它是如何做到的。
我尝试过使用
root.geometry()
,而且
root.geometry()
似乎只返回窗口内容的大小,而不返回带有标题栏和边框大小的窗口的总大小。我见过其他人说,你需要向操作系统要这些东西。我希望避免这种情况,因为这将使代码平台更难独立。必须有一种方法来做到这一点,而不去操作系统的这一点。有人知道我必须怎么做才能得到这个信息吗?
My system:
OS: Linux
KDE血浆: 5.16.4
KDE框架: 5.61.0
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()
测试代码结果:
root.winfo_x() = 100
root.winfo_y() = 100
root.geometry() = 250x250+100+100
使用屏幕尺应用程序测量窗口的高度是:
x=102, y=286
发布于 2020-04-29 01:56:37
我终于弄明白了。为了获得标题栏的高度,我首先向窗口添加了一个框架,并设置了窗口的几何形状(‘1x1’)。我还必须使用update_idletasks()来更新tkinter内部数据。这样做后,我得到了正确的高度。不得不这样做似乎很奇怪,但它起了作用。下面是我用来获得高度的代码。在Windows和Linux中进行测试和工作。如果有人知道更正确的方法,我肯定想知道。另外,如果有人在使用苹果,请告诉我下面的代码是否有效。
更新:我已经更新了代码,并在(Linux、 和MacOS)中进行了测试,以给出正确的标题栏高度。我认为这是最好的方法,因为你不需要使操作系统依赖的系统calls.But,我不知道它是否可以工作的任何缩放级别。
更新:现在可以用于任何缩放级别。(在windows 10,windows 7中通过的测试)
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()
发布于 2020-04-29 08:13:21
标题栏(默认)是一个系统setting.As,据我所知,它取决于许多因素。(系统缩放比,不同的操作系统,新闻部意识等)。
在窗口中,改变缩放比会得到不同的高度值。
关于这个问题: tkinter将在windows中被识别为一个老软件,您需要设置DPI意识,使其具有系统正常高度(如果系统缩放比不是100%,则适合系统缩放比率)。
正常情况下,系统标题栏的高度是相同的:但有些例外(我不太了解
winapi
),不同的新闻部意识会显示出标题栏的不同高度:
同样:
为了使它们相同并得到标题栏的正常高度:
import tkinter
import ctypes