我正在编写一个简短的脚本来在画布中显示用户选择的图像。用户选择的图像可以是不同的尺寸。从长远来看,如果加载的图像大于屏幕分辨率,我希望应用程序最大化并显示滚动条,但是我有一个很可能是一个简单的问题,所选的图像不会加载到画布中。我只需要另一双眼睛。
#!/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()
为什么选中时图像不会加载到画布中?我没有显示错误。 如果图像大于初始窗口大小,我该如何最大化整个窗口? 如果图像大于屏幕分辨率,如何添加滚动条?
由于
答案 0 :(得分:3)
我猜你没看到图像的原因是TK Image类的格式限制。我建议使用PIL或Pillow,它具有与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可能会有所帮助。