【问题标题】:Simple Image viewer简单的图像查看器
【发布时间】:2013-11-11 23:56:35
【问题描述】:

我是这个网站的新手,我正在尝试使用 Tkinter 在 Python 2.7 中创建一个简单的图像查看器,但是当我尝试在其中加载图像时,它没有显示任何内容!我敢打赌这是令人尴尬的事情很明显,但我不知道出了什么问题。我正在使用 Windows XP。这是我的代码:

from Tkinter import *
import tkFileDialog
from PIL import ImageTk, Image

root = Tk(className="Image viewer")

canvas_width = 800
canvas_height = 600
root.config(bg="white")

def openimage():
    picfile = tkFileDialog.askopenfilename()
    img = ImageTk.PhotoImage(file=picfile)
    canvas.create_image(0,0, anchor=NW, image=img) 

yscrollbar = Scrollbar(root)
yscrollbar.pack(side=RIGHT, fill=Y)

xscrollbar = Scrollbar(root, orient=HORIZONTAL)
xscrollbar.pack(side=BOTTOM, fill=X)

canvas = Canvas(root, width=canvas_width, height=canvas_height, yscrollcommand=yscrollbar.set, xscrollcommand=xscrollbar.set)
button = Button(root,text="Open",command=openimage)
button.pack(side=BOTTOM)
canvas.pack(side=TOP)
yscrollbar.config(command=canvas.yview)
xscrollbar.config(command=canvas.xview)

mainloop()

更新:当我删除文件浏览器并为其提供文件路径时它可以工作,但我想要文件浏览器,并且使用标签可以工作,但滚动条不能使用它,我希望能够滚动图片。

【问题讨论】:

  • 我不得不说,对于刚接触该网站的人来说,这是一个非常棒的问题——您已经向我们提供了您想要发生的事情、发生了什么以及似乎失败的代码。坚持下去,你会走得更远。
  • 尝试使用 .gif 和 .jpg。告诉我们会发生什么。
  • 我尝试了一个 .jpg、一个 .png 和一个 .gif

标签: python tkinter python-imaging-library


【解决方案1】:

我在“The Tkinter PhotoImage Class”上发现 PhotoImage 无法分配给函数中的局部变量,因为垃圾收集器将其删除。

所以你可以使用全局变量:

img = None

def openimage():
    global img

    picfile = tkFileDialog.askopenfilename()
    img = ImageTk.PhotoImage(file=picfile)
    canvas.create_image(0,0, anchor=NW, image=img) 

或将图像分配给现有小部件(例如canvas

def openimage():
    picfile = tkFileDialog.askopenfilename()
    canvas.img = ImageTk.PhotoImage(file=picfile)
    canvas.create_image(0,0, anchor=NW, image=canvas.img) 

顺便说一句:你应该检查文件是否被选中

def openimage():
    picfile = tkFileDialog.askopenfilename()
    if picfile:
        canvas.img = ImageTk.PhotoImage(file=picfile)
        canvas.create_image(0,0, anchor=NW, image=canvas.img) 

添加scrollregion,您就有了带有滚动条的文件查看器

def openimage():
    picfile = tkFileDialog.askopenfilename()
    if picfile:
        canvas.img = ImageTk.PhotoImage(file=picfile)
        canvas.create_image(0,0, anchor=NW, image=canvas.img) 
        canvas.configure(canvas, scrollregion=(0,0,canvas.img.width(),canvas.img.height()))

【讨论】:

    【解决方案2】:

    不知道你的代码有问题,但你可以用这个函数代替你的:

    def openimage():
        try:
            Artwork.destroy()
        except Exception:
            pass
        picfile = tkFileDialog.askopenfilename()
        img = ImageTk.PhotoImage(file=picfile)
        #canvas.create_image(0,0, anchor=NW, image=img)
        Artwork=Label(root,image=img)
        Artwork.img=img
        Artwork.pack(side=BOTTOM)#do packing urself
    


    请注意,这是最小实现。

    【讨论】:

    • 是的,我已经尝试使用标签作为画布,但它不支持滚动条
    • 好吧,你没有提到:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2013-02-24
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多