如何解决Python代码问题,应用程序已破坏Tcl错误
| 我正在使Tkinter GUI除了调用图像外什么也不做-当然,我一直在努力寻找合适的tkinter文档。 我的代码中有一行似乎无法按要求执行-我想调出词典中的所有值,然后在调出下一个值之前,分别为每个图像打印并提取具有相同名称的图像。我尝试了dict.itervalues()和dict.values(),似乎无法完全解决任何问题... 无论如何,这是代码段:for key in ansDict.iterkeys(): #using the iterkeys function... kind of
x=key
root = tk.Tk() # root window created (is this in the right place?)
root.title(\'C H E M I S T R Y A B C\\\'s\')
frameAns=tk.Frame(root)
frameAns.grid(row=0,column=0,sticky=tk.NW)
for i in range(len(ansDict[x])):
print \'-->\' + ansDict[x][i]
for value in ansDict.itervalues(): #This is the most important part
for i in range(len(value)): #pulls value list from dictionary named ansDict
picRef1 = Image.open(value[i] + \'.jpg\') #calls image file by the same name using PIL
photo1 = ImageTk.PhotoImage(picRef1,master=root)
button1 = tk.Button(frameAns,compound=tk.TOP,image=photo1,text=str(value[i]) + \'\\nClose me!\',bg=\'white\') #pulls up button onto which the image is pasted
button1.grid(sticky=tk.NW,padx=2,pady=2) #places button on grid
button1.image=photo1
root.mainloop()
最后,最后,它会拉出一两个图像,然后出现以下错误:
TclError:无法调用\“ image \”命令:应用程序已被破坏
而且我不知道出什么问题了。我无法移动image命令,因此我需要以某种方式“保存”它,以便它不会被破坏。我知道这里还有其他代码错误,但是我认为如果弄清楚我得到的TclError,我可以将其他所有内容都设置为正确。
如果有更简单的方法来执行所有操作,请告知!
解决方法
我一直在寻找一个好的解决方案,但是还没有找到合适的解决方案。查看Tkinter.py类,它看起来像Image del值是:
def __del__(self):
if self.name:
try:
self.tk.call(\'image\',\'delete\',self.name)
except TclError:
# May happen if the root was destroyed
pass
这意味着,如果您想进行野蛮的黑客入侵,则可以按照jtp \的链接中所述设置PhotoImage。
photo = tk.PhotoImage(file=\"C:/myimage.gif\")
widget[\"image\"] = photo
widget.image = photo
然后您可以在程序退出之前进行以下修改:
photo.name = None
这将防止它尝试在PhotoImage删除中清理自身,并防止在del方法中调用该异常。我真的不建议您这样做,除非您的背靠在墙上,并且别无选择。
我将继续研究这个问题,如果我找到一个更好的解决方案,将用一个更好的解决方案来编辑此帖子(希望有人在此之前给出正确的解决方案)。
,这是一种可能性,尽管它的结构与您的示例不同。它将四个100像素正方形图像彼此堆叠。我相信您需要为每个Image对象保留单独的引用,因此我将它们藏在了images字典中。
from Tkinter import *
import os
from PIL import Image,ImageTk
image_names = { \'1\':\'one\',\'2\':\'two\',\'3\':\'three\',\'4\':\'four\' }
images = {}
root = Tk()
root.title(\"HELLO\")
frm = Frame(root)
for v in image_names.itervalues():
images[v] = {}
images[v][\'i\'] = Image.open(\"%s%s.jpg\" % (os.path.dirname(__file__),v))
images[v][\'pi\'] = ImageTk.PhotoImage(images[v][\'i\'])
images[v][\'b\'] = Button(frm,image=images[v][\'pi\'])
images[v][\'b\'].pack()
frm.pack()
mainloop()
这是讨论PhotoImage类的好链接。
http://effbot.org/tkinterbook/photoimage.htm
,似乎您不了解事件驱动的编程。您应该一次创建整个GUI,将其填充小部件,设置事件,然后进入无限循环。 GUI应根据您的事件调用回调函数以进行函数绑定。因此,程序的那些部分肯定应该只被调用一次:root = tk.Tk()
,root.mainloop()
。
编辑:添加了事件驱动的编程\“想法示例\”。
from Tkinter import *
master = Tk()
def callback():
print \"click!\"
b = Button(master,text=\"OK\",command=callback)
b.pack()
mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。