两个类的交互,python

时间:2013-05-01 20:52:21

标签: python class

我是Python的新手并且反对定向编程。如果我问一个愚蠢的问题,请原谅: 以下应该是一个简单的文本编辑器。我想在单独的类中使用textfield和菜单栏。当前的错误消息是:

  File "Editor_play.py", line 19, in __init__
    menubar = Menu(window)
RuntimeError: maximum recursion depth exceeded

我的问题:

  1. 我是否必须像我一样调用Textfield的对象和Menu的对象,或者我应该调用对象Textfield并且必须从Textfield中调用Menu?
  2. 如何让菜单了解Textfield中的self.text
  3. 感谢您的期待。

    from Tkinter import *
    import tkFileDialog
    
    class Textfield(object):
      def __init__(self, window):
        self.window = window
        window.title("text editor")
        self.scrollbar = Scrollbar(window)
        self.scrollbar.pack(side="right",fill="y")
        self.text = Text(window,yscrollcommand=self.scrollbar.set)
        self.scrollbar.config(command=self.text.yview)
        self.text.pack()
        window.mainloop()
    
    
    class Menu(object):   
      def __init__(self, window):
        self.window = window
        menubar = Menu(window)
        filemenu = Menu(menubar)
        filemenu.add_command(label="load",command=self.load)
        filemenu.add_command(label="save as",command=self.saveas)
        menubar.add_cascade(label="file",menu=filemenu)
        window.config(menu=menubar)
    
      def load(self):
        self.file = tkFileDialog.askopenfile()
        self.text.delete(1.0, END)
        if self.file:
          self.text.insert(1.0, self.file.read())
    
      def saveas(self):
        self.file = tkFileDialog.asksaveasfile()
        if self.file:
          self.file.write(self.text.get(1.0, END))
    
    
    window =  Tk()            
    textfield = Textfield(window)
    menu = Menu(window)
    

    现在它看起来像这样但它仍然不对。

    菜单类的原因是我想了解它的工作原理。因为我可以有另一个具有相同菜单的应用程序然后我将菜单类放入一个模块。

    在我学习如何使用python进行编程的过程中,对这两个示例类之间的交互的理解对我来说似乎是一个里程碑。我明白了,我可以继续。我之前在另一篇文章中询问我是否可以在构造(进入类)时犯错或创建死胡同。答案是:一切皆有可能,没有限制。现在我想将此应用于此示例。请帮忙。

    当前错误消息是:

    """
    Traceback (most recent call last):
      File "Editor_play.py", line 41, in <module>
        menu = Menubar(window, textfield.text)
      File "Editor_play.py", line 20, in __init__
        menubar = Menu(window)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2580, in __init__
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1974, in __init__
    _tkinter.TclError: this isn't a Tk applicationNULL main window
    """
    
    
    
    from Tkinter import *
    import tkFileDialog
    
    class Textfield(object):
      def __init__(self, window):
        self.window = window
        window.title("text editor")
        self.scrollbar = Scrollbar(window)
        self.scrollbar.pack(side="right",fill="y")
        self.text = Text(window,yscrollcommand=self.scrollbar.set)
        self.scrollbar.config(command=self.text.yview)
        self.text.pack()
        window.mainloop()
    
    
    class Menubar(object):   
      def __init__(self, window, text):
        self.window = window
        self.text = text
        menubar = Menu(window)
        filemenu = Menu(menubar)
        filemenu.add_command(label="load",command=self.load)
        filemenu.add_command(label="save as",command=self.saveas)
        menubar.add_cascade(label="file",menu=filemenu)
        window.config(menu=menubar)
    
      def load(self):
        self.file = tkFileDialog.askopenfile()
        self.text.delete(1.0, END)
        if self.file:
          self.text.insert(1.0, self.file.read())
    
      def saveas(self):
        self.file = tkFileDialog.asksaveasfile()
        if self.file:
          self.file.write(self.text.get(1.0, END))
    
    
    window =  Tk()            
    textfield = Textfield(window)
    menu = Menubar(window, textfield.text)
    

1 个答案:

答案 0 :(得分:1)

您的Menu班级会覆盖Tkinter菜单类。将其重命名为其他内容,您将不会遇到此问题。

让菜单了解Textfield的方法是将Textfield实例作为参数传递给菜单类构造函数。更好的是,如果你所做的只是编写一个简单的文本编辑器,那么你就不需要为MenuTextfield创建单独的类。你可以只有一个“app”类,它继承根对象。