私は主にGUI(Tkinterコード)を含むメインファイルを持っています。 Label
、Text
のユーザーアクションでテキストが更新される領域、およびButton
のウィンドウ。Python:モジュールからクラスの属性にアクセスする方法
# ~/main.py
import Tkinter
import buttonevent
from itertools import cycle
msglist = ['main_msg1\n', 'main_msg2\n', 'main_msg3\n', 'main_msg4\n']
class Root(object):
def __init__(self, master):
self.msglist = cycle(msglist)
self.master = master
self.frame1 = Tkinter.Frame(master)
self.frame1.pack()
Root.status = Tkinter.StringVar()
self.status_info = Tkinter.Label(self.frame1, textvariable=Root.status)
self.status_info.pack()
Root.status.set("Set by constructor")
self.frame2 = Tkinter.Frame(master)
self.frame2.pack()
Root.textinfo = Tkinter.Text(self.frame2, width=20, height=10)
Root.textinfo.insert(Tkinter.END, 'message 1')
Root.textinfo.config(font='Arial')
Root.textinfo.pack()
Root.textinfo.config(bg=master.cget('bg'), relief=Tkinter.SUNKEN)
Root.textinfo.configure(state='disabled')
self.frame3 = Tkinter.Frame(master)
self.frame3.pack()
self.button = Tkinter.Button(self.frame3, text='Ok', command=self.ok)
self.button.pack()
def ok(self):
text_info(self.msglist.next())
buttonevent.do_event()
buttonevent.do_stuff()
def text_info(msg):
Root.textinfo.configure(state='normal')
Root.textinfo.insert(Tkinter.END, msg)
Root.textinfo.see(Tkinter.END)
Root.textinfo.configure(state='disabled')
if __name__ == '__main__':
root = Tkinter.Tk()
main_window = Root(root)
root.mainloop()
ユーザーアクションは別のファイルで定義されています。
# ~/buttonevent.py
from itertools import cycle
import main
do_msg = ['do_msg1\n', 'do_msg2\n', 'do_msg3\n', 'do_msg4\n']
msg = cycle(do_msg)
def do_event():
# do something
main.text_info(msg.next())
def do_stuff():
# do something
print 'doing stuff'
は、以前のコードでは、今、その機能に基づいて、複数のファイルとして作成しようとイム、1つのファイルにありました。基本的には、ユーザーが何か操作をすると、Text
エリアにメッセージが表示されます。 Text
フィールドはメッセージを表示し、すべてのディスプレイ/アクティビティ/アップデート中にいくつかの共通点を持っているので、メインファイルにtext_info
という関数を作成しました。
Text
フィールドに別のメッセージを送信して、別のファイルから更新する場合は、たとえばbuttonevent.py
ファイルからどうすれば実現できますか。
私はそれを実行したときに、私は別のPY-ファイルからメインPY-ファイル内の関数を呼び出すことができますどのように
$ python main.py
do_msg1
Exception in Tkinter callback
Traceback (most recent call last):
File "/home/miniconda2/lib/python2.7/lib-tk/Tkinter.py", line 1537, in __call__
return self.func(*args)
File "main.py", line 38, in ok
buttonevent.do_event()
File "/home/buttonevent.py", line 14, in do_event
main.text_info(xx)
File "/home/main.py", line 51, in text_info
Root.textinfo.configure(state='normal')
AttributeError: type object 'Root' has no attribute 'textinfo'
- としてエラーが発生します。これは、コードに正しい方法ではない場合の最良の方法は何か
- が、私は
main.py
ファイル - で
text_info
ためclass
またはfunction
の使用をしなければならない、私を修正してください。代わりのルートクラスに割り当てる:
Root.status = Tkinter.StringVar()
はそれを割り当てる
'textinfo'は、あなたがルートクラスの少なくとも一つのインスタンスを初期化するまで設定されていないクラス属性です..あなたがあなたの前にあなたの元のファイルのルートクラスのインスタンスを作成する必要がありますtext_info関数を使用できます。少なくとも1つのオブジェクトがインスタンス化されない限り、 '__init__'メソッドのコードは実行されません。ああ。問題はあなたが '' __name__ == '__main __': 'を持っているということです。それは、あなたがメインのものをインポートしたときに、それ以降のすべてが実行されないことを意味します... –