Python Tkinter:如何从<destroy>事件回调中的ScrolledText小部件获取文本?

时间:2015-10-02 13:42:26

标签: python tkinter callback

我知道ScrolledText被构造为Text对象(但是在一个框架中有一个滚动条)。但是,当窗口关闭并调用printText()方法时,以下代码会引发错误:

import Tkinter as tk
import ttk
import ScrolledText as st
class tkGui(object):
    def printText(self, event):
        print "It works!"
        self.mText.get("1.0", 'end-1c')

    def __init__(self, window):
        # create widgets
        self.frame=tk.Frame(window)
        self.mText = st.ScrolledText(self.frame)
        self.mText.bind('<Destroy>',self.printText)
        # place widgets
        self.frame.pack()
        self.mText.pack()

window = tk.Tk()
app = tkGui(window)
window.mainloop()

错误:

[...]
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 3077, in get
  return self.tk.call(self._w, 'get', index1, index2)
TclError: invalid command name ".140506094171344.140506094172280.140506094172496"

我做错了什么?

2 个答案:

答案 0 :(得分:2)

在处理该窗口小部件的<Destroy>事件时,您不应该假设您可以从窗口小部件中获取数据。

来自官方文件:

  

当Destroy事件传递给一个小部件时,它位于一个   “半死”状态:小部件仍然存在,但大部分操作都在其上   会失败。

答案 1 :(得分:2)

一旦销毁主窗口,其所有子窗口小部件都将被销毁,您无法访问它们。 (这在技术上并不正确,正如布莱恩·奥克利的答案所指出的那样,但这就是我对它的看法。试图在破坏之后使用小部件是最有问题的。)

您需要使用wm_protocol

http://nullege.com/codes/search/Tkinter.Tk.wm_protocol

import Tkinter as tk
import ttk
import ScrolledText as st
class tkGui(object):
    def printText(self):
        print "It works!"
        self.mText.get("1.0", 'end-1c')
        self.window.destroy()

    def __init__(self, window):
        # create widgets
        self.window = window
        self.frame=tk.Frame(window)
        self.mText = st.ScrolledText(self.frame)
        #self.mText.bind('<Destroy>',self.printText)
        window.wm_protocol("WM_DELETE_WINDOW", self.printText)
        # place widgets
        self.frame.pack()
        self.mText.pack()

window = tk.Tk()
app = tkGui(window)
window.mainloop()

这里有一些变化。我从event中删除了printText参数,并添加了对self.window.destroy的调用。请注意,我必须添加self.window属性才能进行此调用。基本的变化是使用wm_protocol而不是绑定到事件;其他是必然的后果。