0

我对 Python 和面向对象的编程非常陌生。如果我问的是一个愚蠢的问题,请原谅:以下应该是一个简单的文本编辑器。我希望将文本字段和菜单栏放在单独的类中。当前的错误信息是:

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

我的问题:

  1. 我是否必须像以前那样调用 Textfield 对象和 Menu 对象,还是应该调用对象 Textfield 并且必须从 Textfield 内部调用 Menu?
  2. 我如何让菜单self.text在 Textfield 中了解?

谢谢你的期待。

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)
4

1 回答 1

1

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

让菜单知道的方法Textfield是将您的Textfield实例作为参数传递给菜单类构造函数。更好的是,如果您所做的只是编写一个简单的文本编辑器,那么您实际上不需要为Menu和设置单独的类Textfield。您可以只拥有一个子类化根对象的“app”类。

于 2013-05-01T21:00:08.923 回答