Pysimplegui: [Bug] Enregistrer l'image ne fonctionne pas correctement après un changement de résolution d'écran

Créé le 3 juin 2020  ·  4Commentaires  ·  Source: PySimpleGUI/PySimpleGUI

Type de problèmes (bug, question)

Windows 10 1909

Python 3.7.4

PySimpleGUI 4.15.2


4.15.2 Publié le 15 janvier 2020

C'est essentiel à savoir. Savoir où se trouve votre fichier PySimpleGUI.py est tout aussi important. Vous pouvez les obtenir en ajoutant ceci en haut de votre fichier et en l'exécutant :

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

Vos niveaux d'expérience en mois ou en années

____2y_____ Expérience en programmation Python
_________ Expérience de programmation globale
____oui_____ Avez-vous déjà utilisé un autre framework d'interface graphique Python (tkinter, Qt, etc.) (oui/non c'est bien) ?

Vous avez terminé ces étapes :

  • [x ] Lire les instructions sur la façon de déposer un problème
  • [x ] Recherche dans la documentation principale http://www.PySimpleGUI.org pour votre problème
  • [ ] Recherche dans le readme pour votre port spécifique sinon PySimpleGUI (Qt, WX, Remi)
  • [x ] Recherche de programmes de démonstration similaires à votre objectif http://www.PySimpleGUI.com
  • [ ] Notez qu'il existe également des programmes de démonstration sous chaque port sur GitHub
  • [ ] Exécutez votre programme en dehors de votre débogueur (à partir d'une ligne de commande)
  • [x ] Recherche dans les problèmes (ouverts et fermés) pour voir s'ils ont déjà été signalés

Description du problème / Question / Détails

J'ai utilisé le code du programme https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Save_Window_As_Image.py pour enregistrer mes images sous forme de fichiers PNG. Cela fonctionne bien.
Le problème se produit après avoir augmenté la résolution de l'écran de 1360x768 à 1920x1080 pour enregistrer des images plus grandes. Seule une partie de l'image a été enregistrée. Le même problème se produit avec le programme de démonstration :
grafik
résolution de l'écran d'origine 1360x768 :
grafik
Passer à une résolution inférieure à l'original semble fonctionner
Ma question est : quelle partie de python dois-je réinstaller pour que le script fonctionne à nouveau ?

Sinon je suis très satisfait de PySimpleGUI, voir https://meteorspectroscopy.org/2020/03/27/meteor-spectra-analysis-new-version/ pour une description de mon script basé dessus

Code à dupliquer

Demo_Save_Window_As_Image.py voir ci-dessus

Demo Programs

Commentaire le plus utile

@Jason ,

merci beaucoup pour vos conseils. J'ai ajouté les deux lignes à mon code et cela fonctionne pour toutes les résolutions.

C'est ce que j'aime chez PySimpleGUI : j'obtiens toujours des solutions à mes problèmes. Réponse très rapide également. Super!

Martin
grafik

Tous les 4 commentaires

Les programmes de démonstration offrent 2 fonctions. Ils fournissent des modèles de conception/des exemples d'utilisation de fonctionnalités ou de fonctions spécifiques de PySimpleGUI. L'autre chose qu'ils font est de montrer comment intégrer votre application à d'autres packages ou bibliothèques. Ils ne sont pas censés être des applications à part entière, mais comme implicite, des démos. Je ne suis pas un expert PIL donc je ne sais pas comment vous conseiller sur la meilleure façon de résoudre votre problème en utilisant le package PIL.

Le programme Meteor Spectra Analysis est assez impressionnant !

Parfois, j'ai aussi des problèmes de résolution d'affichage. Ce n'est pas causé par PySimpleGUI, mais par tkinter.

La fonction TkWinDisplayChanged dans tkinter utilise l'appel API Windows GetDeviceCaps pour obtenir la largeur et la hauteur de l'écran avec les paramètres HORZRES et VERTRES.

Dans GetDeviceCaps , il y a la note :

GetDeviceCaps rapporte les informations fournies par le pilote d'affichage. Si le pilote d'affichage refuse de signaler des informations, GetDeviceCaps calcule les informations en fonction de calculs fixes. Si le pilote d'affichage signale des informations non valides, GetDeviceCaps renvoie les informations non valides. De plus, si le pilote d'affichage refuse de rapporter des informations, GetDeviceCaps peut calculer des informations incorrectes car il suppose soit un DPI fixe (96 DPI) soit une taille fixe (selon les informations que le pilote d'affichage a fournies ou non). Malheureusement, un pilote d'affichage implémenté dans le modèle de pilote d'affichage Windows (WDDM) (introduit dans Windows Vista) empêche GDI d'obtenir les informations. GetDeviceCaps doit donc toujours calculer les informations.

Cela signifie que le résultat n'est pas fiable, donc la plupart du temps, j'ajoute ceci dans mon script avant l'endroit où tkinter a été utilisé, et la plupart du temps cela fonctionne bien. Pour ne pas changer de résolution lors de l'exécution de python ou de tkinter, certaines valeurs seront stockées et conservées inchangées.

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

Vous pouvez peut-être l'essayer.

@Jason ,

merci beaucoup pour vos conseils. J'ai ajouté les deux lignes à mon code et cela fonctionne pour toutes les résolutions.

C'est ce que j'aime chez PySimpleGUI : j'obtiens toujours des solutions à mes problèmes. Réponse très rapide également. Super!

Martin
grafik

Celui-ci est tout @jason990420 !!! Wow merci!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

flowerbug picture flowerbug  ·  4Commentaires

mozesa picture mozesa  ·  5Commentaires

MikeTheWatchGuy picture MikeTheWatchGuy  ·  3Commentaires

mozesa picture mozesa  ·  4Commentaires

xuguojun168 picture xuguojun168  ·  3Commentaires