Pysimplegui: [バグ]画面の解像度を変更した後、画像の保存が正しく機能しない

作成日 2020年06月03日  ·  4コメント  ·  ソース: PySimpleGUI/PySimpleGUI

問題の種類(バグ、質問)

Windows 10 1909

Python 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プログラミングの経験
_________プログラミング経験全体
____yes_____以前に別のPythonGUIフレームワーク(tkinter、Qtなど)を使用したことがありますか(はい/いいえで問題ありません)?

次の手順を完了しました。

  • [x]問題を提出する方法の説明を読む
  • [x]メインドキュメントhttp://www.PySimpleGUI.orgで問題を検索しました
  • [] PySimpleGUI(Qt、WX、Remi)でない場合は、readmeで特定のポートを検索しました
  • [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

最も参考になるコメント

@ジェイソン

アドバイスありがとうございます。 コードに2行を追加しましたが、すべての解像度で機能します。

それが私が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 Display Driver Model(WDDM)(Windows Vistaで導入)に実装されているディスプレイドライバーは、GDIが情報を取得しないため、GetDeviceCapsは常に情報を計算する必要があります。

これは、結果が信頼できないことを意味するため、ほとんどの場合、tkinterが使用される前にこれをスクリプトに追加し、ほとんどの場合、正常に機能します。 pythonまたはtkinterの実行時に解像度を切り替えないように、一部の値は保存され、変更されません。

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

おそらくあなたはそれを試すことができます。

@ジェイソン

アドバイスありがとうございます。 コードに2行を追加しましたが、すべての解像度で機能します。

それが私がPySimpleGUIで気に入っていることです。私は常に問題の解決策を手に入れています。 また、非常に迅速な対応。 素晴らしい!

マーティン
grafik

これはすべて@ jason990420です!!! わぁ、ありがとう!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

このページは役に立ちましたか?
0 / 5 - 0 評価