簡體   English   中英

Python Tkinter:如何從ScrolledText小部件上獲取文本 <Destroy> 事件回調?

[英]Python Tkinter: how to get text from ScrolledText widget on <Destroy> event 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"

我究竟做錯了什么?

處理該窗口小部件的<Destroy>事件時,您不應假定可以從窗口小部件中獲取數據。

從官方文檔中:

當Destroy事件傳遞到窗口小部件時,它處於“半死”狀態:窗口小部件仍然存在,但是對其的大多數操作都會失敗。

銷毀主窗口后,其所有子部件都將銷毀,並且您將無法訪問它們。 (正如布萊恩·奧克利(Bryan Oakley)的答案所指出的那樣,這在技術上是不正確的,但這是我的想法。在銷毀后嘗試使用這些小部件充其量是有問題的。)

您需要使用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()

這里有幾個更改。 我從printText刪除了event參數,並添加了對self.window.destroy的調用。 請注意,我必須添加self.window屬性才能進行此調用。 基本的更改是使用wm_protocol而不是綁定到事件。 其他都是必然的后果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM