在使用多个对象时,在tkinter Python中查找属性所属的对象

时间:2015-06-16 08:53:17

标签: python python-3.x tkinter

我的程序包含3个类。整个程序在MainWindow类中运行。 MainWindow类首先初始化自身,然后是self.menubar对象。下一个对象是一个文本框,我将其命名为self.journal。

程序运行后,我尝试访问open_file的{​​{1}}方法,这是通过访问MainWindow filemenu方法来完成的。当我尝试打开文本文件时出现以下错误:Menubar

我尝试将AttributeError: 'Menubar' object has no attribute 'journal'替换为self.journalMainWindow.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() 方法

1 个答案:

答案 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的实例。