【问题标题】:Why does Tkinter Canvas widget show images at a wrong scale?为什么 Tkinter Canvas 小部件以错误的比例显示图像?
【发布时间】:2020-07-23 19:29:04
【问题描述】:

我正在尝试使用 Tkinter 和 Pillow 打开图像文件并在 python 3.8 中显示它们,但是我的屏幕上的图像缩放错误。

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 图像查看器和缩放 = 100% 的 Gimp:

4 个打印语句都显示“500”,系统的每个部分似乎都同意图像以 500x500 显示,但屏幕上的实际像素除外。无论出于何种原因,它被缩放到接近 750x750 的大小,到底是什么在缩放我的图像?这对于我尝试在 Tkinter 中打开的所有图像都是一致的,无论窗口大小和小部件大小如何。

在屏幕分辨率为 1920x1080 的 Windows 10 上测试。

【问题讨论】:

  • 您应该添加图像500x500.jpg,以便我们可以查看此文件是否在其他计算机上出现问题。或者,图像可能有其他信息,使其在 Canvas 上变得更大 - 例如有关 DPI 的信息。
  • 你应该添加它 - 更多的人会看到它,也许有人会检查它。
  • 图像在非常旧的计算机上的 Linux 上的 Tkinter 和 GIMP 中看起来相同。我怀疑:如果它使用 HDPI,可能问题出在系统或硬件上,并且 Tkinter 可能无法正确显示它。

标签: python tkinter


【解决方案1】:

它被缩放到接近 750x750

750/500 = 150%。看来你的系统缩放比例是150%。

要显示正确的图像大小。就像 furas 说的,你需要使用DPI awareness。阅读MSDN official doc中的问题

关于DPI awareness

为了解决这个问题,您可以在代码中设置 DPI 感知。(或者您可以将缩放比例更改为 100%) 在我的电脑中,没有 DPI 意识的大小不一样。现在设置 DPI 意识后:

在你的代码中添加这个:

import ctypes

ctypes.windll.shcore.SetProcessDpiAwareness(2) # this could only be used when your version of windows >= 8.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2012-04-22
    • 1970-01-01
    • 2020-11-04
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多