python - 当我在 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:我尝试用两个屏幕运行该应用程序,发生的事情真的很有趣,当我在足够的屏幕上使用它时它运行正常,但是当我将它滑到另一个屏幕并进行任何操作时/事件它会自动调整它的大小。
解决方案
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://msdn.microsoft.com/en-us/C9488338-D863-45DF-B5CB-7ED9B869A5E2
您还可以阅读我之前关于 Windows 应用程序中 DPI 意识的回答:
推荐阅读
- python - 如何在 django 中制作二维码扫描仪
- asp.net - Asp.net Core Linq 查询耗时过长
- django - Django Rest Framework - 添加数据并返回
- url-rewriting - Discord PY Bot 未响应事件
- scala - 为什么进入下一个循环后数据帧值没有改变?
- keras - Keras Pretrained ResNet 101 V2:如何使用过滤器大小?
- python - 在 Julia 中扩展复值函数
- amazon-web-services - EC2 中的 Logstash 无法与 AWS 中的 ElasticSerach 域连接
- css - 为什么 .a .b{color: #ffffff;} 会影响我的 b 类对象,而不是 .b{color: #ffffff;}?
- r - 用引导值替换 glm 的值