【问题标题】:tkinter: Ensure image fills the whole of the canvastkinter:确保图像填满整个画布
【发布时间】:2019-02-02 18:48:09
【问题描述】:

我正在尝试在我的系统上制作一个非常简单的示例(macOS Mojave 和 Python 3.6+)。我想知道我是否在做一些根本错误的事情。最小复制器:

import tkinter
from PIL import Image, ImageTk
img = Image.open('lenna.png')
root = tkinter.Tk()
canvas = tkinter.Canvas(root, width=img.width, height=img.height,
    background='blue')
canvas.pack()
tkimg = ImageTk.PhotoImage(img)
imagesprite = canvas.create_image(0, 0, anchor=tkinter.NW, image=tkimg)
root.mainloop()

图片(大小为 512x512 像素):

这是我看到的:

如您所见,图像向左上方偏移了大约 3 个像素(注意图像右侧和底部的蓝条)。由于画布具有与输入图像相同的尺寸,我认为这段代码应该使图像占据整个画布,但在测试的 python 版本(3.6.7、3.6.8 和 3.7)上并非如此。 2 在 macOS Mojave 上,通过 conda 安装;Python 3.7.2 通过 homebrew 安装)。

注意:此示例在 Linux 上完美运行。

另一个注意事项:更改上面的 create_image 调用,使其锚定在 (3,3) 而不是 (0,0) 上解决了这个问题,相当神奇。不确定这 3 个像素位移的来源...

问题:如果不将图像锚定在 (3,3) 而不是 (0,0) - 如何确保图像实际占据整个画布?我的代码有问题还是这是一个错误(任何地方都没有痕迹 - 但也许我的 search-fu 不是那么先进)?

我测试的受影响版本:

  • python 3.6.7、3.6.8、3.7.2 来自 conda(默认通道),TclVersion 和 TkVersion = 8.6 (tkinter.TkVersion)
  • python 3.7.2 来自自制软件,TclVersion 和 TkVersion = 8.5

【问题讨论】:

  • 当您创建Canvas 时,请尝试同时指定borderwidth=0highlightthickness=0

标签: python python-3.x macos tkinter


【解决方案1】:

画布有一个边框和一个高光环,这会导致画布的内部稍微偏移。将borderwidthhighlightthicknes 选项设置为零。而且由于您依赖pack 默认值,这在不同平台上可能会有所不同,因此您也应该将填充显式设置为零。

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2016-01-09
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2011-07-18
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多