我遇到了使用以下代码在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()
任何帮助将不胜感激。
答案 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中那样在单独的线程中运行它们。
基本上,主线程必须运行主循环,并且您的代码只能使用上面列出的方法同时运行,因此您可能不得不重新构建整个程序。