Pysimplegui: [Bug] 更改屏幕分辨率后,保存图像无法正常工作

创建于 2020-06-03  ·  4评论  ·  资料来源: PySimpleGUI/PySimpleGUI

问题类型(错误、问题)

视窗 10 1909

蟒蛇 3.7.4

PySimpleGUI 4.15.2


4.15.2 2020 年 1 月 15 日发布

了解这一点至关重要。 了解 PySimpleGUI.py 文件所在的位置同样重要。 您可以通过将其添加到文件顶部并运行它来获得这些:

import PySimpleGUI as sg
print(sg)
print(sg.version)

您以月或年为单位的经验水平

____2y_____ Python 编程经验
_________ 总体编程经验
____是_____ 以前使用过另一个 Python GUI 框架(tkinter、Qt 等)(是/否很好)?

您已完成以下步骤:

  • [x] 阅读有关如何提交问题的说明
  • [x] 通过主要文档http://www.PySimpleGUI.org搜索您的问题
  • [ ] 如果不是 PySimpleGUI(Qt、WX、Remi),请通过自述文件搜索您的特定端口
  • [x] 寻找与您的目标类似的演示程序http://www.PySimpleGUI.com
  • [ ] 注意GitHub上每个端口下也有Demo Programs
  • [ ] 在调试器之外运行程序(从命令行)
  • [x] 搜索问题(打开和关闭)以查看是否已报告

问题描述/问题/细节

我使用程序https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Save_Window_As_Image.py的代码将我的图像保存为 PNG 文件。 这工作正常。
在我将屏幕分辨率从 1360x768 增加到 1920x1080 以保存更大的图像后,问题出现了。 仅保存了部分图像。 演示程序出现同样的问题:
grafik
原始屏幕分辨率 1360x768:
grafik
分辨率低于原始分辨率似乎可行
我的问题是:我必须重新安装 python 的哪一部分才能使脚本再次工作?

否则我对 PySimpleGUI 非常满意,请参阅https://meteorspectroscopy.org/2020/03/27/meteor-spectra-analysis-new-version/以了解我基于它的脚本的描述

要复制的代码

Demo_Save_Window_As_Image.py 见上

Demo Programs

最有用的评论

@杰森

非常感谢您的建议。 我将这两行添加到我的代码中,它适用于所有分辨率。

这就是我喜欢 PySimpleGUI 的地方:我总能找到解决问题的方法。 反应也非常快。 伟大的!

马丁
grafik

所有4条评论

演示程序提供 2 个功能。 它们提供了如何使用特定 PySimpleGUI 特性或功能的设计模式/示例。 他们做的另一件事是演示将您的应用程序与其他包或库集成的方法。 它们并不意味着是成熟的应用程序,而是隐含的演示。 我不是 PIL 专家,所以我不知道如何建议您使用 PIL 包最好地解决您的问题。

流星光谱分析程序令人印象深刻!

有时我也有显示分辨率的问题。 它不是由 PySimpleGUI 引起的,而是由 tkinter 引起的。

tkinter 中的函数 TkWinDisplayChanged 使用 Windows API 调用 GetDeviceCaps 以参数 HORZRES 和 VERTRES 获取屏幕宽度和高度。

GetDeviceCaps 中,有注意事项:

GetDeviceCaps 报告显示驱动程序提供的信息。 如果显示驱动程序拒绝报告任何信息,GetDeviceCaps 将根据固定计算计算信息。 如果显示驱动程序报告无效信息,GetDeviceCaps 将返回无效信息。 此外,如果显示驱动程序拒绝报告信息,GetDeviceCaps 可能会计算出不正确的信息,因为它假定固定 DPI (96 DPI) 或固定大小(取决于显示驱动程序提供和未提供的信息)。 不幸的是,为 Windows 显示驱动程序模型 (WDDM)(在 Windows Vista 中引入)实现的显示驱动程序导致 GDI 无法获取信息,因此 GetDeviceCaps 必须始终计算信息。

这意味着结果不受信任,所以大多数情况下,我在使用 tkinter 之前将其添加到我的脚本中,并且大部分时间它都可以正常工作。 python 或 tkinter 运行时不要切换分辨率,一些值将被存储并保持不变。

import ctypes
ctypes.windll.user32.SetProcessDPIAware()   # Set unit of GUI to pixels

或许你可以试试。

@杰森

非常感谢您的建议。 我将这两行添加到我的代码中,它适用于所有分辨率。

这就是我喜欢 PySimpleGUI 的地方:我总能找到解决问题的方法。 反应也非常快。 伟大的!

马丁
grafik

这就是@jason990420 !!! 哇谢谢你!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

此页面是否有帮助?
0 / 5 - 0 等级