我已经创建了一个菜单栏,并且试图创建键盘快捷方式来打开这些链接。该快捷方式将运行一个运行类的函数。此类创建一个新窗口。但我不断收到此错误:
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时应出现一个新窗口。
答案 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