Pysimplegui: [Ошибка] Сохранить изображение некорректно после изменения разрешения экрана.

Созданный на 3 июн. 2020  ·  4Комментарии  ·  Источник: PySimpleGUI/PySimpleGUI

Тип проблем (ошибка, вопрос)

Windows 10 1909 г.

Python 3.7.4

PySimpleGUI 4.15.2


4.15.2 Выпущено 15 января 2020 г.

Это очень важно знать. Не менее важно знать, где находится ваш файл PySimpleGUI.py. Вы можете получить их, добавив это в начало файла и запустив его:

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

Ваш уровень опыта в месяцах или годах

____2y_____ Опыт программирования на Python
_________ Общий опыт программирования
____yes_____ Вы использовали ранее другой Python GUI Framework (tkinter, Qt и т. д.) (да / нет)?

Вы выполнили эти шаги:

  • [x] Прочтите инструкции о том, как подать вопрос
  • [x] Поиск вашей проблемы в основных документах http://www.PySimpleGUI.org.
  • [] Выполнял поиск в файле readme для вашего конкретного порта, если не PySimpleGUI (Qt, WX, Remi)
  • [x] Искал демонстрационные программы, похожие на вашу цель http://www.PySimpleGUI.com
  • [] Обратите внимание, что есть также демонстрационные программы под каждым портом на GitHub.
  • [] Запустите вашу программу вне отладчика (из командной строки)
  • [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.

Программа Meteor Spectra Analysis впечатляет!

Иногда у меня также возникают проблемы с разрешением дисплея. Это вызвано не PySimpleGUI, а tkinter.

Функция TkWinDisplayChanged в tkinter использует вызов API Windows GetDeviceCaps для получения ширины и высоты экрана с параметрами HORZRES и VERTRES.

В GetDeviceCaps есть примечание:

GetDeviceCaps сообщает информацию, предоставляемую драйвером дисплея. Если драйвер дисплея отказывается сообщать какую-либо информацию, GetDeviceCaps вычисляет информацию на основе фиксированных вычислений. Если драйвер дисплея сообщает недопустимую информацию, GetDeviceCaps возвращает недопустимую информацию. Кроме того, если драйвер дисплея отказывается сообщать информацию, GetDeviceCaps может вычислить неверную информацию, поскольку предполагает либо фиксированный DPI (96 точек на дюйм), либо фиксированный размер (в зависимости от информации, которую драйвер дисплея предоставил и не предоставил). К сожалению, драйвер дисплея, реализованный в модели драйвера дисплея 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 рейтинги