我的程序包含3个类。整个程序在MainWindow类中运行。 MainWindow类首先初始化自身,然后是self.menubar对象。下一个对象是一个文本框,我将其命名为self.journal。
程序运行后,我尝试访问open_file
的{{1}}方法,这是通过访问MainWindow
filemenu
方法来完成的。当我尝试打开文本文件时出现以下错误:Menubar
。
我尝试将AttributeError: 'Menubar' object has no attribute 'journal'
替换为self.journal
和MainWindow.journal
,但似乎无效。
TextBox.journal
我强调了引起我问题的那条线。它在class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
''''''
''''''
self.menubar = Menubar(self) # instantaiated Menubar object
'''''
'''''
self.journal = TextBox(self.frame, name='Journal')
'''''
'''''
def open_file(self):
filename = MainWindow.getFileNameOpen(self)
if filename == '': # No file chosen
filename = None
else:
self.MainWindow.journal.delete(1.0, END) # This line is the problem
fh = open(filename, 'r')
textFromFile = fh.read().rstrip()
self.MainWindow.journal.insert(1.0, textFromFile)
fh.close()
class Menubar:
def __init__(self, parent):
self.menubar = tk.Menu(parent)
self.fileMenu(self.menubar)
def fileMenu(self, parent):
filemenu = tk.Menu(parent, tearoff=0)
filemenu.add_command(label='Open', accelerator='Ctrl+O', underline=0, command=lambda: MainWindow.open_file(self))
class TextBox(tk.Text):
def __init__(self, parent, name='', *args, **kwargs):
tk.Label(master=parent, text=name).pack()
tk.Text.__init__(self, master=parent, *args, **kwargs)
self.text.pack()
方法
答案 0 :(得分:2)
你可以尝试类似下面的代码 -
类菜单栏:
def __init__(self, parent):
self.pt = parent
self.menubar = tk.Menu(parent)
self.fileMenu(self.menubar)
def fileMenu(self, parent):
filemenu = tk.Menu(parent, tearoff=0)
filemenu.add_command(label='Open', accelerator='Ctrl+O', underline=0, command=lambda: self.pt.open_file())
请注意,我将parent
保存在self
中,然后使用self.pt
代替Main.
,如果不起作用,您也可以尝试 -
lambda: MainWindow.open_file(self.pt)
而不是当前的lambda部分。
问题在于代码 -
lambda: MainWindow.open_file(self)
这样做是因为它试图在MAinWindow类中调用open_file函数,并将当前MenuBar
类的实例(对象)作为参数传递。
当你在一个类中调用一个函数时,使用object,就这样说 -
obj.func(**params)
在内部,python如何调用它将等同于ItsClass.func(obj, **params)
,因此在open_file()
函数内部,当您访问自身对象(通过参数传入)时,它不是{的实例{1}},而是MainWindow
的实例。