【问题标题】:Python Tkinter - Image not displayingPython Tkinter - 图像不显示
【发布时间】:2014-01-14 14:38:17
【问题描述】:

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

#!/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()

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

谢谢

【问题讨论】:

  • 代码缩进看起来很乱。

标签: python canvas tkinter


【解决方案1】:

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

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

sudo apt-get install python-imaging-tk

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

#!/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 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多