首页 > 解决方案 > 当我在 Spyder 中运行它以及直接在终端中运行它时,HIGH DPI Tkinter 重新缩放

问题描述

这可能不是一个编码问题。

我在 Tkinter 中开发了一个应用程序,它几乎包含在我加载图像的画布(matplots)中。

当我从 Spyder 或 Jupyter notebook 运行它时,我获得 143 DPI,当我直接在终端中运行它时,我获得 95 DPI。

最奇怪的是,一旦我从终端运行它,它就会显示为 143 DPI 应用程序,但是当我加载图像时,应用程序决定完全调整大小,然后更改我屏幕的 DPI。所以整个事情都会调整大小,按钮,弹出框等等......

可以从终端运行它对我来说非常重要,因为之后我会将其转换为 .exe 应用程序。

我的第一种方法是使用 tkinter 方法 .winfo_fpixel() 并尝试对 DPI 进行比率并将其与应用程序中的每个维度相乘。

后来我试图找到python.exe和pythonw.exe以改变与HIGH DPI Scale的兼容性。

你觉得有办法解决这个问题而无需调整所有内容吗?

我想坚持我 100% 确定这与代码无关,因此我可能不会发布任何编码示例。

谢谢。

obs:我使用的是Windows 10 ps:我尝试用两个屏幕运行该应用程序,发生的事情真的很有趣,当我在足够的屏幕上使用它时它运行正常,但是当我将它滑到另一个屏幕并进行任何操作时/事件它会自动调整它的大小。

标签: pythonwindowsspyderdpihighdpi

解决方案


DPI 很大程度上受 PC 分辨率设置的影响——特别是“缩放和布局”设置。100% 是 96 DPI,150% 是 144 DPI。我猜这只是您的应用程序显示 95 和 143 的舍入错误。笔记本电脑往往具有更高分辨率的屏幕,因此 OEM 的默认设置为 >100%,这样您就不必眯着眼睛查看您的应用程序。而您的典型 1080p 显示器默认为 100% DPI。但是,当您将“远程桌面”“远程”到 PC 中时,如果其 DPI 和分辨率不同,Windows 可能会重新调整和重新拉伸 DPI 设置以匹配本地显示。

在此处输入图像描述

Windows 将自动缩放大多数尚未使用操作系统明确设置其“DPI 感知”的应用程序。这对于大多数应用程序来说通常都很好(尽管它们可能看起来“模糊”)。应用程序可以编译为 dpi 感知,除非在某些多显示器情况下,否则不会拉伸。这尤其适用于图形应用程序。这就是您所看到的错误往往会出现的地方。您通常可以通过右键单击 EXE、单击属性并找到设置兼容性选项卡来更改此行为:

在此处输入图像描述

最奇怪的是,一旦我从终端运行它,它就会显示为 143 DPI 应用程序,但是当我加载图像时,应用程序决定完全调整大小,然后更改我屏幕的 DPI。所以整个事情都会调整大小,按钮,弹出框等等......

当您远程连接到您的 PC 时,系统 DPI 发生了变化。应用程序可能会感到困惑——尤其是当它们不适应不断变化的 DPI 设置时。或者更糟糕的是,应用程序向 Windows 注册它可以识别 DPI,但不处理显示器被换出的极端情况 - 这实际上是当你远程进入它时发生的情况。但是,您可以通过上面的“属性”对话框和可用 API 的某种组合来覆盖此行为以控制 dpi 感知。

我不太了解 TKinter(它是使用 Python 进程还是它自己的 exe?)。如果您可以自己编译,则可以使用各种 Windows API 和清单设置来获得您想要的 DPI 行为。我在黑暗中猜测是 TKinter( 声明自己是每个监视器 dpi 感知的,但是有一个错误不能解释 DPI 的动态变化。 这种情况的典型解决方法是重新启动应用程序

您需要在以下链接中了解的所有信息:

https://docs.microsoft.com/en-us/windows/desktop/hidpi/high-dpi-desktop-application-development-on-windows

https://docs.microsoft.com/en-us/windows/desktop/api/shellscalingapi/nf-shellscalingapi-setprocessdpiawareness

https://msdn.microsoft.com/en-us/C9488338-D863-45DF-B5CB-7ED9B869A5E2

您还可以阅读我之前关于 Windows 应用程序中 DPI 意识的回答:

https://stackoverflow.com/search?q=user%3A104458+dpi


推荐阅读