Python Tkinter - 图像不显示

时间:2014-01-14 14:38:17

标签: python canvas tkinter

我正在编写一个简短的脚本来在画布中显示用户选择的图像。用户选择的图像可以是不同的尺寸。从长远来看,如果加载的图像大于屏幕分辨率,我希望应用程序最大化并显示滚动条,但是我有一个很可能是一个简单的问题,所选的图像不会加载到画布中。我只需要另一双眼睛。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Tkinter import Tk, Canvas, Frame, Menu, BOTH, NW
import Image 
import ImageTk
import tkFileDialog

appname = "example"

class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)   

        self.parent = parent        
        self.initUI()

    def initUI(self):

        self.parent.title( appname )

        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)

        fileMenu = Menu(menubar, tearoff=0)
        fileMenu.add_command(label="Open File", command=self.fileOpen)

        fileMenu.add_command(label="Exit", command=self.onExit)
        menubar.add_cascade(label="File", menu=fileMenu)

    def onExit(self):
        self.quit()

    def fileOpen(self):
    file = tkFileDialog.askopenfile(
        parent=self.parent,
        mode='rb',
        title='Choose a file',
        filetypes=[ ( "Image files",("*.jpg", "*.jpeg" ) )] )

    if file != None:

        self.img = Image.open(file)
        self.tatras = ImageTk.PhotoImage(self.img)

        canvas = Canvas(self, width=self.img.size[0]+20, 
           height=self.img.size[1]+20)
        canvas.create_image(10, 10, anchor=NW, image=self.tatras)
        canvas.pack(fill=BOTH, expand=1)

    def filePref(self):
    self.quit()

def main():

    root = Tk()
    root.geometry("250x150+300+300")
    app = Example(root)
    root.mainloop()  

if __name__ == '__main__':
    main()

为什么选中时图像不会加载到画布中?我没有显示错误。 如果图像大于初始窗口大小,我该如何最大化整个窗口? 如果图像大于屏幕分辨率,如何添加滚动条?

由于

1 个答案:

答案 0 :(得分:3)

我猜你没看到图像的原因是TK Image类的格式限制。我建议使用PILPillow,它具有与TK兼容的图像类,并且具有更好的image format support(您可以尝试打开GIF文件以确保它是原因)。

要运行此代码,您需要python映像库,并在您的计算机上安装其ImageTk模块。在Ubuntu中,您可以像这样安装:

sudo apt-get install python-imaging-tk

这是所需的应用程序代码(我稍微改变了类结构,但这只是个人偏好)。也为Canvas启用了垂直和水平滚动条。

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

appname = "example"

class App(object):
    def __init__(self, root=None):
        if not root:
            root = Tk()
        self.root = root
        self.initUI()

    def initUI(self):
        self.root.title(appname)
        menubar = Menu(self.root)
        self.root.config(menu=menubar)
        fileMenu = Menu(menubar, tearoff=0)
        fileMenu.add_command(label="Open File", command=self.fileOpen)
        fileMenu.add_command(label="Exit", command=self.onExit)
        menubar.add_cascade(label="File", menu=fileMenu)
        self.canvas = Canvas(self.root)
        self.canvas.pack(side=LEFT, fill=BOTH)
        self.scrollbar_vert = Scrollbar(self.root)
        self.scrollbar_vert.pack(side=RIGHT, fill=Y)
        self.scrollbar_hor = Scrollbar(self.root)
        self.scrollbar_hor.config(orient=HORIZONTAL)
        self.scrollbar_hor.pack(side=BOTTOM, fill=X)

    def onExit(self):
        self.root.quit()

    def fileOpen(self):
        filename = tkFileDialog.askopenfile(
                parent=self.root,
                mode='rb',
                title='Choose a file',
                filetypes=[ ( "Image files",("*.jpg", "*.jpeg", "*.png", "*.gif") ), ("All files", ("*.*"))] )

        if filename == None:
            return
        self.img = Image.open(filename)
        self.photo_image = ImageTk.PhotoImage(self.img)
        self.canvas.pack_forget()
        self.canvas = Canvas(self.root, width=self.img.size[0], height=self.img.size[1])
        self.canvas.create_image(10, 10, anchor=NW, image=self.photo_image)
        self.canvas.pack(side=LEFT, fill=BOTH)
        self.canvas.config(yscrollcommand=self.scrollbar_vert.set)
        self.canvas.config(xscrollcommand=self.scrollbar_hor.set)
        self.canvas.config(scrollregion=self.canvas.bbox(ALL))
        self.scrollbar_vert.config(command=self.canvas.yview)
        self.scrollbar_hor.config(command=self.canvas.xview)

    def run(self):
        self.root.mainloop()

def main():
    root = Tk()
    root.geometry("250x150+300+300")
    app = App(root)
    app.run()

if __name__ == '__main__':
    main()

如果您仍然无法打开PNG或JPG图像,this question可能会有所帮助。