Python代码问题,应用程序已破坏Tcl错误

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?