Python Tkinter。使用绑定创建新窗口时,修复属性错误“事件对象没有属性tk”

时间:2019-04-15 15:59:27

标签: python tkinter

我已经创建了一个菜单栏,并且试图创建键盘快捷方式来打开这些链接。该快捷方式将运行一个运行类的函数。此类创建一个新窗口。但我不断收到此错误:

    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时应出现一个新窗口。

2 个答案:

答案 0 :(得分:1)

bind在被调用时会生成一个事件,然后将其传递给回调函数。简而言之,您正在做:

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

该事件不能成为Toplevel的主持人。

答案 1 :(得分:1)

将功能绑定到键时,将使用一个位置参数来表示功能,该位置参数表示导致绑定的事件。

考虑以下代码:

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

当调用self.AddNewEntry时,tkinter将使用一个参数调用它,该参数是表示事件的对象(例如:self.AddNewEntry(event))。该对象具有诸如接收事件的小部件,鼠标指针的x / y坐标,所按下的键等属性。

您已将此参数命名为master,这使我认为您期望该代码以某种方式表示主窗口或根窗口。实际上,您已将该参数传递给addComic,然后它尝试将此事件对象用作Toplevel窗口的主窗口。由于您不能将事件对象用作其他窗口的主对象,因此会出现错误。

虽然您可以修改绑定以将master传递给函数,但是由于您将master存储为类的属性,因此您无需这样做-{{1} }已经知道AddNewEntry是什么。

解决方案是重写master以接受AddNewEntry参数并将其忽略,然后将event向下传递到self.master

addComic