在Python中使用画布tkinter窗口正确显示图像

umuewwlo  于 2022-12-15  发布在  Python
关注(0)|答案(2)|浏览(203)

当通过画布显示时,输入图像的一部分被截断。tkinter窗口中的create_image
我尝试过更改canvas.create_image对象中的“side”参数和宽度/高度值。
下面是我代码和输入图像:

import tkinter as tk
from tkinter import *
from tkinter.filedialog import askopenfilename
import os
from PIL import ImageTk, Image

def show_values():
    print(slider1.get())

window = tk.Tk()

filename = askopenfilename()  # show an "Open" dialog box and return the path to the selected file
print(filename)

slider1 = Scale(window, from_=0, to=42, orient='vertical')
slider1.pack(side=LEFT)

canvas = Canvas(window)
canvas.pack()
img = ImageTk.PhotoImage(Image.open(filename))
imageWidth = img.width()
imageHeight = img.height()

canvas.create_image(imageWidth + 1, imageHeight + 1, image=img)
canvas.pack(side=RIGHT)

Button(window, text='Process Image', command=show_values).pack(side=BOTTOM)

window.mainloop()

mqkwyuun

mqkwyuun1#

问题的根源在于,默认情况下,图像被放置在画布上,图像的中心位于给定的坐标处,你根据图像的宽度和高度给出坐标,这就是中心的位置。
例如,问题中的图像为297x170。您使用这些坐标作为图像的坐标,这意味着图像的中心将位于297x170。画布大约为300x200。由于图像的中心位于x=297,因此它将延伸到画布的右边缘和下边缘之外。
现在还不清楚你想让图片显示在哪里,但是为了说明anchor是如何影响位置的,一个简单的解决方法是把图片放在0,0处,并把anchor设置为“nw”(西北)。这将显示整个图片。如果你想让图片在画布中居中,解决方案只需要一点数学运算来计算画布中心的坐标。

jdgnovmf

jdgnovmf2#

答案是不使用画布,而是使用框架和标签来显示图像。下面是一个工作示例:

import tkinter as tk
from tkinter import *
from tkinter.filedialog import askopenfilename
import os
from PIL import ImageTk, Image

def show_values():
    print(slider1.get())

window = tk.Tk()

filename = askopenfilename()  # show an "Open" dialog box and return the path to the selected file
print(filename)
filename3, file_extension = os.path.splitext(filename)

slider1 = Scale(window, from_=0, to=42, orient='vertical')
slider1.pack(side=LEFT)

frame = Frame(window, width=600, height=400)
frame.pack()

img = ImageTk.PhotoImage(Image.open(filename))
imageWidth = img.width()
imageHeight = img.height()

label = Label(frame, image = img)
label.pack(side=RIGHT)

Button(window, text='Process Image', command=show_values).pack(side=BOTTOM)

window.mainloop()

相关问题