【发布时间】:2015-11-29 08:24:31
【问题描述】:
我创建了一个简短的脚本来在 Tkinter 画布元素中显示照片。我将画布元素的大小调整为与照片相同的大小,但是当我启动窗口时,无论我扩大多少窗口,我通常只会看到图像的一小部分。
此外,当我打印出用于设置画布大小的图像大小时,该大小显示为 (922, 614),而当我在画布上记录鼠标点击时,右下角位于 (500, 300) 之类的位置。我的代码如下。我应该更改哪些内容才能使画布与图像大小相同并完全显示图像?
class AppWindow(Frame):
def __init__(self, parent, list_of_files, write_file):
Frame.__init__(self, parent)
self.parent = parent
...
self.image = None
self.canvas = None
self.index = -1
self.loadImage()
self.initUI()
self.resetCanvas()
def initUI(self):
self.style = Style()
self.style.theme_use("default")
self.pack(fill=BOTH, expand=1)
...
self.canvas = Tkinter.Canvas(self, width = self.image.width(), height = self.image.height())
def loadImage(self):
self.index += 1
img = cv2.imread(self.list_of_files[self.index])
img = cv2.resize(img, (0,0), fx = IMAGE_RESIZE_FACTOR, fy = IMAGE_RESIZE_FACTOR)
b, g, r = cv2.split(img)
img = cv2.merge((r,g,b))
im = Image.fromarray(img)
self.image = ImageTk.PhotoImage(image=im)
def resetCanvas(self):
self.canvas.create_image(0, 0, image=self.image)
self.canvas.place(x = 0, y = 0, height = self.image.height(), width = self.image.width())
这是一张截图,展示了一张照片以及它在 Tkinter 画布中的呈现方式:
这是我迄今为止尝试过的:
- 不调整图像大小或更改调整大小 - 这没有任何作用
- 使画布成为图像大小的两倍而不是等于图像,喜欢
self.canvas = Tkinter.Canvas(self, width = self.image.width()*2, height = self.image.height()*2)这确实使画布更大(我可以说是因为我在画布上有一些绘图功能),但图像保持不变相同的小尺寸,不显示整个图像 - 当我用
cv2.imshow()显示 cv2 格式图像时,我看到了完整的图像,所以不是cv2正在切断图像的一部分。
我意识到我上面的内容并不是一个完整的工作示例。我已经缩减了脚本,现在运行它我仍然看到同样的问题:
import Tkinter
import Image, ImageTk
from Tkinter import Tk, BOTH
from ttk import Frame, Button, Style
import cv2
import os
import time
import itertools
IMAGE_RESIZE_FACTOR = .3
class AppWindow(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.loadImage()
self.initUI()
def loadImage(self):
img = cv2.imread("w_4131.jpg")
img = cv2.resize(img, (0,0), fx = IMAGE_RESIZE_FACTOR, fy = IMAGE_RESIZE_FACTOR)
b, g, r = cv2.split(img)
img = cv2.merge((r,g,b))
im = Image.fromarray(img)
self.image = ImageTk.PhotoImage(image=im)
def initUI(self):
self.style = Style()
self.style.theme_use("default")
self.pack(fill=BOTH, expand=1)
print "width and height of image should be ", self.image.width(), self.image.height()
self.canvas = Tkinter.Canvas(self, width = self.image.width(), height = self.image.height())
self.canvas.pack()
self.canvas.create_image(0, 0, image=self.image)
def main():
root = Tk()
root.geometry("250x150+300+300")
app = AppWindow(root)
root.mainloop()
if __name__ == '__main__':
main()
【问题讨论】:
-
如果你
pack画布而不是放置它会发生什么? -
@Kevin 我只是尝试了
self.canvas.pack()和self.canvas.pack(fill=Tkinter.BOTH)而不是.place()调用。结果是一样的。您建议如何/在哪里致电pack()? -
self.canvas.configure(height = self.image.height(), width = self.image.width()) in resetCanvas?
-
@EricLevieil 也许我的排序错误,但在
place之前或之后或pack之前或之后,它本身没有明显的影响