我有一個主要文件,主要包含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'
以前的代碼是在一個單一的文件,現在我試圖把它寫成一個多文件的基礎上它的功能。基本上,當用戶做一些事情時,一條消息將顯示在Text
區域。由於Text
字段顯示消息並且在每次顯示/活動/更新時都具有一些共同性,因此我在主文件中爲它創建了一個函數text_info
。
說如果我想在Text
字段上發送不同的消息以更新不同的文件,例如從buttonevent.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'
- 我如何可以調用主PY-文件的功能從不同的PY-文件。
- 什麼是最好的方式,我應該做的
main.py
文件 - 使用
class
或function
爲text_info
如果這不是代碼的正確方法,請大家指正。
'textinfo'是沒有設置直到你初始化的根類的至少一個實例。你需要你之前在原始文件創建根類的實例類屬性可以使用text_info函數。除非至少有一個對象被實例化,否則'__init__'方法中的代碼永遠不會執行。啊哈。問題是你有'if __name__ =='__main __':'這意味着當你導入主體時,所有的東西都不會被執行... –