Pysimplegui: [Bug] Salvar imagem não funciona corretamente após a alteração da resolução da tela

Criado em 3 jun. 2020  ·  4Comentários  ·  Fonte: PySimpleGUI/PySimpleGUI

Tipo de problema (bug, pergunta)

Windows 10 1909

Python 3.7.4

PySimpleGUI 4.15.2


4.15.2 Lançado em 15 de janeiro de 2020

É fundamental saber isso. Saber onde seu arquivo PySimpleGUI.py está localizado é tão importante. Você pode obtê-los adicionando isto ao início do seu arquivo e executando-o:

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

Seus níveis de experiência em meses ou anos

____2y_____ Experiência de programação Python
_________ Experiência de programação geral
____Sim_____ Já usou outro Python GUI Framework (tkinter, Qt, etc) anteriormente (sim / não está bem)?

Você concluiu estas etapas:

  • [x] Leia as instruções sobre como registrar um problema
  • [x] Pesquisei nos documentos principais http://www.PySimpleGUI.org para seu problema
  • [] Pesquisei no leia-me sua porta específica, se não PySimpleGUI (Qt, WX, Remi)
  • [x] Procurou programas de demonstração semelhantes ao seu objetivo http://www.PySimpleGUI.com
  • [] Observe que também existem programas de demonstração em cada porta no GitHub
  • [] Execute seu programa fora do depurador (a partir de uma linha de comando)
  • [x] Pesquisei os problemas (abertos e fechados) para ver se já foram relatados

Descrição do problema / pergunta / detalhes

Usei o código do programa https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Save_Window_As_Image.py para salvar minhas imagens como arquivos PNG. Isso funciona bem.
O problema ocorre depois que aumentei a resolução da tela de 1360x768 para 1920x1080 para salvar imagens maiores. Apenas parte da imagem foi salva. O mesmo problema ocorre com o programa de demonstração:
grafik
resolução de tela original 1360x768:
grafik
Ir para uma resolução mais baixa do que a original parece funcionar
Minha pergunta é: que parte do python devo reinstalar para fazer o script funcionar novamente?

Caso contrário, estou muito satisfeito com o PySimpleGUI, consulte https://meteorspectroscopy.org/2020/03/27/meteor-spectra-analysis-new-version/ para obter uma descrição do meu script com base nele

Código para duplicar

Demo_Save_Window_As_Image.py veja acima

Demo Programs

Comentários muito úteis

@Jason ,

Muito obrigado pelo seu conselho. Eu adicionei as duas linhas ao meu código e funciona para todas as resoluções.

É disso que gosto no PySimpleGUI: sempre consigo soluções para os meus problemas. Também uma resposta muito rápida. Excelente!

Martin
grafik

Todos 4 comentários

Os programas de demonstração oferecem 2 funções. Eles fornecem padrões de design / exemplos de como usar recursos ou funções específicas do PySimpleGUI. A outra coisa que eles fazem é demonstrar maneiras de integrar seu aplicativo a outros pacotes ou bibliotecas. Eles não foram feitos para serem aplicativos completos, mas, como implícito, demos. Não sou um especialista em PIL, então não sei como aconselhar você sobre a melhor forma de resolver seu problema usando o pacote PIL.

O programa Meteor Spectra Analysis é bastante impressionante!

Às vezes também tenho problemas com a resolução da tela. Não é causado por PySimpleGUI, mas tkinter.

A função TkWinDisplayChanged em tkinter usa a chamada de API do Windows GetDeviceCaps para obter a largura e altura da tela com os parâmetros HORZRES e VERTRES.

Em GetDeviceCaps , há uma observação:

GetDeviceCaps relata informações que o driver de vídeo fornece. Se o driver de vídeo se recusar a relatar qualquer informação, GetDeviceCaps calcula a informação com base em cálculos fixos. Se o driver de vídeo relatar informações inválidas, GetDeviceCaps retornará as informações inválidas. Além disso, se o driver de vídeo se recusar a relatar informações, GetDeviceCaps pode calcular informações incorretas porque assume DPI fixo (96 DPI) ou um tamanho fixo (dependendo das informações que o driver de vídeo forneceu e não forneceu). Infelizmente, um driver de vídeo que é implementado no Windows Display Driver Model (WDDM) (introduzido no Windows Vista) faz com que o GDI não obtenha as informações, então GetDeviceCaps deve sempre calcular as informações.

Isso significa que o resultado não é confiável, então, na maioria das vezes, adiciono isso ao meu script antes de o tkinter ser usado e, na maioria das vezes, funciona bem. Para não mudar a resolução quando o python ou tkinter estiver em execução, alguns valores serão armazenados e mantidos inalterados.

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

Talvez você possa tentar.

@Jason ,

Muito obrigado pelo seu conselho. Eu adicionei as duas linhas ao meu código e funciona para todas as resoluções.

É disso que gosto no PySimpleGUI: sempre consigo soluções para os meus problemas. Também uma resposta muito rápida. Excelente!

Martin
grafik

Este é tudo @ jason990420 !!! Uau, obrigado !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

MikeTheWatchGuy picture MikeTheWatchGuy  ·  6Comentários

xuguojun168 picture xuguojun168  ·  3Comentários

mozesa picture mozesa  ·  5Comentários

ECOM-Klaus picture ECOM-Klaus  ·  4Comentários

MikeTheWatchGuy picture MikeTheWatchGuy  ·  5Comentários