Tkinter的:确保图像充满整个画布的

时间:2019-02-02 18:48:09

标签: python python-3.x macos tkinter

我试图让我的系统(MacOS的莫哈韦与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()

图像(512×512像素大小):

lenna.png

这是我看到的:

canvas displayed

可以看到,该图像是大约3个像素移动到左上角(在图像的右侧和底注蓝色条)。由于画布具有与输入图像相同的尺寸,因此我认为这段代码应使图像占据整个画布,但在经过测试的python版本(3.6.7、3.6.8和3.7)中不是这种情况。 2在macOS Mojave上通过conda安装;在Python 3.7.2中通过自制程序安装。

N.B .:本实施例工作完美无缺Linux上。

另一注:更改上面的create_image调用,使其固定在(3,3)而不是(0,0)上,这很神奇地解决了这个问题。不知道这3个像素的起源位移...

问:如果没有锚定在(3,3)的图像,而不是(0,0) - 如何确保图像实际上占据整个画布的?是不是有什么错我的代码,或者这是一个错误(没有跟踪任何地方 - 但也许我的搜索富不是那么先进)?

我与测试受影响的版本:

  • 来自conda(默认通道)的python 3.6.7、3.6.8、3.7.2,带有TclVersion和TkVersion = 8.6(tkinter.TkVersion
  • 使用TclVersion和TkVersion = 8.5从自制软件中获取的python 3.7.2

1 个答案:

答案 0 :(得分:0)

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