Почему виджет Tkinter Canvas показывает изображения в неправильном масштабе? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь открыть файлы изображений и отобразить их в python 3.8, используя Tkinter и Pillow, но что-то неправильно масштабирует изображения на моем экране.

import tkinter as tk
from PIL import Image, ImageTk


class ViewingWindow(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.image = None
        self.canvas = tk.Canvas(self, width=500, height=500)
        self.canvas.pack()

    def setImage(self, img):
        self.image = img
        print(img.width())
        print(img.height())
        print(self.canvas["width"])
        print(self.canvas["height"])
        self.canvas.create_image(0, 0, anchor=tk.NW, image=img)


window = tk.Tk()

canvas = ViewingWindow(window)
canvas.pack()

img = Image.open("500x500.jpg")
img = ImageTk.PhotoImage(img)
canvas.setImage(img)

window.mainloop()

Это результат, показанный для справки: Windows Просмотрщик изображений в «Показать фактический размер» и Gimp при масштабировании = 100%: enter image description here

Все 4 оператора печати показывают «500», каждая часть системы, похоже, согласны с тем, что изображение отображается в 500x500, за исключением фактических пикселей на экране. По какой-то причине он масштабируется до значения, близкого к 750x750, что в мире масштабирует мое изображение? Это согласуется со всеми изображениями, которые я пытался открыть в Tkinter, и независимо от размера окна и размеров виджетов.

Протестировано на Windows 10 с разрешением экрана 1920x1080.

1 Ответ

1 голос
/ 11 апреля 2020

масштабируется до значения, близкого к 750x750

750/500 = 150%. Похоже, что коэффициент масштабирования вашей системы составляет 150%.

enter image description here Чтобы показать правильный размер изображения. Как сказал furas, вам нужно использовать DPI awareness. Прочтите проблему в Официальный MSDN: c

О DPI DPI .

Чтобы решить эту проблему, вы можете установить DPI DPI в вашем коде (или вы можете изменить коэффициент масштабирования до 100%). В моем P C тот же размер без распознавания DPI. Теперь после установки осведомленности о DPI: enter image description here

Добавьте это в свой код:

import ctypes

ctypes.windll.shcore.SetProcessDpiAwareness(2) # this could only be used when your version of windows >= 8.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...