簡體   English   中英

Python Tkinter。 使用綁定創建新窗口時修復屬性錯誤“事件對象沒有屬性tk”

[英]Python Tkinter. Fix attribute error “Event object has no attribute tk” when using binding to create a new window

我已經創建了一個菜單欄,並且試圖創建鍵盤快捷方式來打開這些鏈接。 該快捷方式將運行一個運行類的函數。 此類創建一個新窗口。 但我不斷收到此錯誤:

    AttributeError: 'Event' object has no attribute 'tk'

對於與我類似的問題,我經歷了許多答案,但沒有成功。 我讀過多個答案,我需要完成一個類的實例的創建。

我不明白的是,當單擊菜單欄上的鏈接時,它會起作用。 在綁定命令之前的TrackComicScreen類中。

這是我的代碼的最小化版本。

    from tkinter import *

    class TrackComicScreen:
        def __init__(self, master):
            self.master = master
            root.bind("<Control-Shift-A>", self.AddNewEntry)

        def AddNewEntry(self, master):
            addComic(master)

    class addComic:
        def __init__(self, master):
            self.AddNewEntryWindow = Toplevel(master)
            self.AddNewEntryWindow.geometry('460x440')

    #WINDOW PROPERTIES
    root = Tk()
    root.geometry("1074x714")
    currWindow = TrackComicScreen(root)
    root.mainloop()

錯誤消息提取

 addComic(master) self.AddNewEntryWindow = Toplevel(master) BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra) BaseWidget._setup(self, master, cnf) self.tk = master.tk AttributeError: 'Event' object has no attribute 'tk' 

預期結果是按Ctrl Shift A時會出現一個新窗口。

bind在調用時會生成一個事件,然后將其傳遞給回調函數。 簡而言之,您正在執行:

def AddNewEntry(self, event):
    addComic(event)

並且該事件不能成為Toplevel

當您將功能綁定到鍵時,該功能將由一個位置參數引起,該位置參數表示導致綁定的事件。

考慮以下代碼:

root.bind("<Control-Shift-A>", self.AddNewEntry)

調用self.AddNewEntry時, self.AddNewEntry將使用一個參數來調用它,該參數是表示事件的對象(例如: self.AddNewEntry(event) )。 該對象具有諸如接收事件的小部件,鼠標指針的x / y坐標,所按下的鍵等屬性。

您已將此參數命名為master ,這使我認為您期望該代碼以某種方式表示master或root窗口。 事實上,你傳遞參數addComic ,然后嘗試使用此事件對象作為主窗口的Toplevel窗口。 由於您不能將事件對象用作另一個窗口的主對象,因此會出現錯誤。

雖然您可以修改綁定以將master傳遞給函數,但是由於將master存儲為類的屬性,因此無需這樣做AddNewEntry已經知道master是什么。

解決方案是重寫AddNewEntry以接受event參數並忽略它,然后將self.master傳遞給addComic

def AddNewEntry(self, event):
    addComic(self.master)

暫無
暫無

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

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