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. Menuself.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 でプログラミングする方法を学習する途中で、これら 2 つのサンプル クラス間の相互作用を理解することは、私にとってマイルストーンのようです。私が理解したもの、私は続けることができます。私は以前、別の投稿で、(クラスに) 構造化するときに実際に間違いを犯したり、行き止まりを作成したりできるかどうかを尋ねました。答えは次のとおりでした。すべてが可能であり、制限はありません。これをこの例に適用したいと思います。助けてください。

現在のエラー メッセージは次のとおりです。

"""
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に別々のクラスを用意する必要はありません。ルート オブジェクトをサブクラス化する「アプリ」クラスを作成することもできます。MenuTextfield

于 2013-05-01T21:00:08.923 に答える