【问题标题】:tkinter destroy error adding text to canvastkinter 销毁错误将文本添加到画布
【发布时间】:2016-02-01 03:15:38
【问题描述】:

当我使用 create_text 将文本添加到画布时,我收到错误 alloc: invalid block: 047129A8: c0 4

这是一个示例程序。如果 create_text 被删除,单击矩形会关闭程序,但在添加文本后程序会关闭,但会出现错误消息并弹出一个窗口,提示 python 已停止工作。

如果我用 quit() 替换 destroy(),它工作正常。 (Python 3.5)

import tkinter as TK
class Button():
    def __init__(self):
        self.master = TK.Tk()
        canvas_width = 200
        canvas_height =200
        canvas = TK.Canvas(self.master, width=canvas_width,  height=canvas_height)
        button = canvas.create_rectangle([10,10,110,30],fill='lightgrey')
        canvas.tag_bind(button, "<ButtonPress-1>", self.test) # lambda x: self.action(x,DOWN))  
        canvas.pack()
        canvas_id = canvas.create_text(10, 50, anchor="nw")
        canvas.itemconfig(canvas_id, text="this is the text")
        TK.mainloop()
    def test(self, e):
        print ('Clicked')
        #self.master.quit()
        self.master.destroy()
if __name__ == '__main__':
    b = Button()

【问题讨论】:

  • 那你为什么不使用.quit()?它使 python 崩溃,因为处理运行 self.test 的线程的 tkinter 实例在中途被破坏,而使用 .quit() 使系统在关闭时有更多机会进行清理。
  • 我不明白为什么添加 create_text 会导致这种情况。没有 create_text (我已经在一个更大的应用程序上测试过)破坏工作正常。是的,我当然可以使用 quit,但是当出现错误时,我想知道原因。
  • 哦误解了什么奇怪的行为,刚刚测试它删除create_text,它在我的mac上做了同样的事情。在那种情况下忘记我之前的评论,我也想知道为什么会发生这种情况!

标签: python canvas tkinter


【解决方案1】:

我也多次遇到这个问题,但现在我想出了一个办法。您只需在关闭窗口之前删除文本即可。

import tkinter as TK
class Button():
    def __init__(self):
        self.master = TK.Tk()
        canvas_width = 200
        canvas_height = 200
        self.canvas = TK.Canvas(self.master, width=canvas_width,  height=canvas_height)
        button = self.canvas.create_rectangle([10,10,110,30],fill='lightgrey')
        self.canvas.tag_bind(button, "<ButtonPress-1>", self.test) # lambda x: self.action(x,DOWN))  
        self.canvas.pack()
        self.canvas_id = self.canvas.create_text(10, 50, anchor="nw")
        self.canvas.itemconfig(self.canvas_id, text="this is the text")
        TK.mainloop()
    def test(self, e):
        print('Clicked')
        self.canvas.delete(self.canvas_id) #delete the text
        self.master.destroy()              #then close

if __name__ == '__main__':
    b = Button()

顺便说一句,我将canvas 更改为self.canvas,以便我可以在“测试”功能中访问它。

希望这会有所帮助:D

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多