用Python打开JPEG图像

时间:2013-09-09 02:18:32

标签: python image jpeg

我遇到了使用以下代码在Python 2.7中打开jpeg图像的问题。

import Tkinter as tk
from PIL import ImageTk, Image

path = 'C:/Python27/chart.jpg'

root = tk.Tk()
img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")
root.mainloop() 

jpeg打开很好,但代码停止运行。我想在程序中间打开jpeg但是一旦图像打开,其余的代码都不会被执行。

我也尝试使用下面的代码打开jpeg,但只是得到错误"没有名为Image"的模块。我已经安装了PIL,它是正确的2.7版本。

import Image

image = Image.open('File.jpg')
image.show()

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Tkinter是单线程的。 root.mainloop调用进入GUI循环,负责显示和更新所有图形元素,处理用户事件等,阻塞直到图形应用程序退出。在mainloop退出后,您将无法再以图形方式更新任何内容。

因此,您可能需要重新考虑程序的设计。您可以使用两种方法在主循环旁边运行自己的代码:

选项1:在单独的线程中运行您的代码

在进入主循环之前,产生一个运行自己代码的线程。

...
def my_code(message):
   time.sleep(5)
   print "My code is running"
   print message


my_code_thread = threading.Thread(target= my_code, args=("From another thread!"))
my_code_thread.start()
root.mainloop()

选项2:使用Tk.after

在主循环内运行代码
root.after_idle(my_code) #will run my_code as soon as it can
root.mainloop()

警告 mainloop负责与使GUI可用相关的所有内容。当您的代码在mainloop线程(使用root.after_idle或root.after进行调度)中运行时,GUI将完全无响应(冻结),因此请确保您没有使用长时间运行的操作加载主循环。像在选项1中那样在单独的线程中运行它们。

基本上,主线程必须运行主循环,并且您的代码只能使用上面列出的方法同时运行,因此您可能不得不重新构建整个程序。