Pysimplegui: [Bug] Bild speichern funktioniert nach Änderung der Bildschirmauflösung nicht richtig

Erstellt am 3. Juni 2020  ·  4Kommentare  ·  Quelle: PySimpleGUI/PySimpleGUI

Art der Probleme (Fehler, Frage)

Windows 10 1909

Python 3.7.4

PySimpleGUI 4.15.2


4.15.2 Veröffentlicht am 15. Januar 2020

Dies ist wichtig zu wissen. Genauso wichtig ist es zu wissen, wo sich Ihre PySimpleGUI.py-Datei befindet. Sie können diese erhalten, indem Sie dies oben in Ihre Datei einfügen und ausführen:

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

Ihre Erfahrungsstufen in Monaten oder Jahren

____2y_____ Python-Programmiererfahrung
_________ Programmiererfahrung insgesamt
____ja_____ Haben Sie zuvor ein anderes Python-GUI-Framework (tkinter, Qt usw.) verwendet (ja/nein ist in Ordnung)?

Sie haben diese Schritte abgeschlossen:

  • [x ] Anweisungen zum Einreichen eines Problems lesen
  • [x] Durchsuchte Hauptdokumente http://www.PySimpleGUI.org nach Ihrem Problem
  • [ ] Durchsuchte die Readme nach Ihrem spezifischen Port, wenn nicht PySimpleGUI (Qt, WX, Remi)
  • [x ] Nach Demoprogrammen gesucht, die Ihrem Ziel ähnlich sind http://www.PySimpleGUI.com
  • [ ] Beachten Sie, dass es unter jedem Port auf GitHub auch Demoprogramme gibt
  • [ ] Führen Sie Ihr Programm außerhalb Ihres Debuggers aus (von einer Befehlszeile aus)
  • [x ] Probleme durchsucht (offen und geschlossen), um zu sehen, ob sie bereits gemeldet wurden

Problembeschreibung / Frage / Details

Ich habe den Code des Programms https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Save_Window_As_Image.py verwendet , um meine Bilder als PNG-Dateien zu speichern. Dies funktioniert gut.
Das Problem tritt auf, nachdem ich die Bildschirmauflösung von 1360x768 auf 1920x1080 erhöht habe, um größere Bilder zu speichern. Nur ein Teil des Bildes wurde gespeichert. Das gleiche Problem tritt mit dem Demoprogramm auf:
grafik
ursprüngliche Bildschirmauflösung 1360x768:
grafik
Eine niedrigere Auflösung als das Original zu wählen scheint zu funktionieren
Meine Frage ist: Welchen Teil von Python muss ich neu installieren, damit das Skript wieder funktioniert?

Ansonsten bin ich mit PySimpleGUI sehr zufrieden, siehe https://meteorspectroscopy.org/2020/03/27/meteor-spectra-analysis-new-version/ für eine Beschreibung meines darauf basierenden Skripts

Code zum Duplizieren

Demo_Save_Window_As_Image.py siehe oben

Demo Programs

Hilfreichster Kommentar

@Jason ,

vielen dank für deinen rat. Ich habe die beiden Zeilen zu meinem Code hinzugefügt und es funktioniert für alle Auflösungen.

Das gefällt mir an PySimpleGUI: Ich bekomme immer Lösungen für meine Probleme. Auch sehr schnelle Reaktion. Groß!

Martin
grafik

Alle 4 Kommentare

Demoprogramme bieten 2 Funktionen. Sie bieten Entwurfsmuster / Beispiele für die Verwendung bestimmter PySimpleGUI-Features oder -Funktionen. Außerdem zeigen sie Möglichkeiten zur Integration Ihrer Anwendung mit anderen Paketen oder Bibliotheken. Sie sind nicht als ausgewachsene Anwendungen gedacht, sondern wie impliziert Demos. Ich bin kein PIL-Experte und kann Sie daher nicht beraten, wie Sie Ihr Problem mit dem PIL-Paket am besten lösen können.

Das Meteor Spectra Analysis-Programm ist ziemlich beeindruckend!

Manchmal habe ich auch Probleme mit der Auflösung des Displays. Es wird nicht von PySimpleGUI verursacht, sondern von tkinter.

Die Funktion TkWinDisplayChanged in tkinter verwendet den Windows-API-Aufruf GetDeviceCaps, um die Bildschirmbreite und -höhe mit den Parametern HORZRES und VERTRES zu ermitteln.

In GetDeviceCaps gibt es einen Hinweis:

GetDeviceCaps meldet Informationen, die der Anzeigetreiber bereitstellt. Wenn der Anzeigetreiber es ablehnt, Informationen zu melden, berechnet GetDeviceCaps die Informationen basierend auf festen Berechnungen. Wenn der Anzeigetreiber ungültige Informationen meldet, gibt GetDeviceCaps die ungültigen Informationen zurück. Wenn der Anzeigetreiber die Meldung von Informationen ablehnt, berechnet GetDeviceCaps möglicherweise falsche Informationen, da entweder feste DPI (96 DPI) oder eine feste Größe (abhängig von den Informationen, die der Anzeigetreiber bereitgestellt hat und nicht bereitgestellt hat) angenommen wird. Leider führt ein Bildschirmtreiber, der im Windows Display Driver Model (WDDM) (eingeführt in Windows Vista) implementiert ist, dazu, dass GDI die Informationen nicht erhält, sodass GetDeviceCaps die Informationen immer berechnen muss.

Es bedeutet, dass das Ergebnis nicht vertrauenswürdig ist, also füge ich dies meistens in mein Skript ein, bevor tkinter verwendet hat, und meistens funktioniert es gut. Um die Auflösung nicht zu ändern, wenn Python oder Tkinter ausgeführt wird, werden einige Werte gespeichert und unverändert beibehalten.

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

Vielleicht kannst du es versuchen.

@Jason ,

vielen dank für deinen rat. Ich habe die beiden Zeilen zu meinem Code hinzugefügt und es funktioniert für alle Auflösungen.

Das gefällt mir an PySimpleGUI: Ich bekomme immer Lösungen für meine Probleme. Auch sehr schnelle Reaktion. Groß!

Martin
grafik

Das ist alles @jason990420 !!! Wow Danke!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen