Pysimplegui: [Bug] Simpan Gambar tidak berfungsi dengan benar setelah perubahan resolusi layar

Dibuat pada 3 Jun 2020  ·  4Komentar  ·  Sumber: PySimpleGUI/PySimpleGUI

Jenis Masalah (Bug, Pertanyaan)

Windows 10 1909

Python 3.7.4

PySimpleGUI 4.15.2


4.15.2 Dirilis 15-Jan-2020

Ini penting untuk diketahui. Mengetahui di mana file PySimpleGUI.py Anda berada sama pentingnya. Anda bisa mendapatkannya dengan menambahkan ini ke bagian atas file Anda dan menjalankannya:

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

Tingkat Pengalaman Anda Dalam Bulan atau Tahun

__2tahun_____ Pengalaman pemrograman Python
_________ Pengalaman pemrograman secara keseluruhan
____yes_____ Pernah menggunakan Kerangka GUI Python lain (tkinter, Qt, dll) sebelumnya (ya/tidak boleh)?

Anda telah menyelesaikan langkah-langkah ini:

  • [x ] Baca instruksi tentang cara mengajukan Masalah
  • [x ] Mencari melalui dokumen utama http://www.PySimpleGUI.org untuk masalah Anda
  • [ ] Mencari melalui readme untuk port spesifik Anda jika bukan PySimpleGUI (Qt, WX, Remi)
  • [x ] Mencari Program Demo yang mirip dengan tujuan Anda http://www.PySimpleGUI.com
  • [ ] Perhatikan bahwa ada juga Program Demo di bawah setiap port di GitHub
  • [ ] Jalankan program Anda di luar debugger Anda (dari baris perintah)
  • [x ] Mencari melalui Masalah (terbuka dan tertutup) untuk melihat apakah sudah dilaporkan

Deskripsi Masalah / Pertanyaan / Detail

Saya menggunakan kode program https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Save_Window_As_Image.py untuk menyimpan gambar saya sebagai File PNG. Ini bekerja dengan baik.
Masalah terjadi setelah saya meningkatkan resolusi layar dari 1360x768 menjadi 1920x1080 untuk menyimpan gambar yang lebih besar. Hanya sebagian dari gambar yang disimpan. Masalah yang sama terjadi dengan program demo:
grafik
resolusi layar asli 1360x768:
grafik
Pergi ke resolusi yang lebih rendah dari aslinya tampaknya berhasil
Pertanyaan saya adalah: bagian python mana yang harus saya instal ulang agar skrip berfungsi kembali?

Kalau tidak, saya sangat puas dengan PySimpleGUI, lihat https://meteorspectroscopy.org/2020/03/27/meteor-spectra-analysis-new-version/ untuk deskripsi skrip saya berdasarkan itu

Kode Untuk Duplikat

Demo_Save_Window_As_Image.py lihat di atas

Demo Programs

Komentar yang paling membantu

@Jason ,

terima kasih banyak atas saran Anda. Saya menambahkan dua baris ke kode saya dan berfungsi untuk semua resolusi.

Itulah yang saya sukai dari PySimpleGUI: Saya selalu mendapatkan solusi untuk masalah saya. Juga sangat cepat responnya. Besar!

Martin
grafik

Semua 4 komentar

Program demo menyediakan 2 fungsi. Mereka menyediakan pola/contoh desain tentang cara menggunakan fitur atau fungsi PySimpleGUI tertentu. Hal lain yang mereka lakukan adalah mendemonstrasikan cara mengintegrasikan aplikasi Anda dengan paket atau pustaka lain. Mereka tidak dimaksudkan sebagai aplikasi lengkap tetapi seperti yang tersirat, demo. Saya bukan ahli PIL jadi saya tidak tahu bagaimana menyarankan Anda tentang cara terbaik untuk memecahkan masalah Anda menggunakan paket PIL.

Program Analisis Spektrum Meteor cukup mengesankan!

Terkadang saya juga memiliki masalah pada resolusi tampilan. Ini bukan disebabkan oleh PySimpleGUI, tetapi tkinter.

Fungsi TkWinDisplayChanged di tkinter menggunakan panggilan API windows GetDeviceCaps untuk mendapatkan lebar dan tinggi layar dengan parameter HORZRES dan VERTRES.

Di GetDeviceCaps , ada catatan:

GetDeviceCaps melaporkan info yang disediakan oleh driver tampilan. Jika driver tampilan menolak untuk melaporkan info apa pun, GetDeviceCaps menghitung info berdasarkan perhitungan tetap. Jika driver tampilan melaporkan info yang tidak valid, GetDeviceCaps mengembalikan info yang tidak valid. Juga, jika driver tampilan menolak untuk melaporkan info, GetDeviceCaps mungkin menghitung info yang salah karena mengasumsikan DPI tetap (96 DPI) atau ukuran tetap (tergantung pada info yang dilakukan dan tidak disediakan oleh driver tampilan). Sayangnya, driver tampilan yang diimplementasikan ke Windows Display Driver Model (WDDM) (diperkenalkan di Windows Vista) menyebabkan GDI tidak mendapatkan info, jadi GetDeviceCaps harus selalu menghitung info.

Itu berarti hasilnya tidak dipercaya, jadi sebagian besar waktu, saya menambahkan ini ke skrip saya sebelum tkinter digunakan, dan sebagian besar waktu berfungsi dengan baik. Untuk tidak mengubah resolusi saat python atau tkinter berjalan, beberapa nilai akan disimpan dan tidak berubah.

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

Mungkin Anda bisa mencobanya.

@Jason ,

terima kasih banyak atas saran Anda. Saya menambahkan dua baris ke kode saya dan berfungsi untuk semua resolusi.

Itulah yang saya sukai dari PySimpleGUI: Saya selalu mendapatkan solusi untuk masalah saya. Juga sangat cepat responnya. Besar!

Martin
grafik

Yang ini semua @jason990420 !!! Wow Terimakasih!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat