我有一个主文件,其中主要包含GUI(Tkinter代码)。一个窗口,其中包含 Label
、一个 Text
区域(其中文本根据用户操作进行更新)和一个 Button
。
# ~/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.c 文件中为
文件text_info
使用class
还是function
吗? py - 如果这不是正确的编码方式,请纠正我。
最佳答案
您可以通过将 Root 实例的引用作为函数的参数来实现您想要的目的:
而不是分配给 Root 类:
Root.status = Tkinter.StringVar()
将其分配给 Root 实例:
self.status = Tkinter.StringVar()
没有理由将其分配给 Root 类而不是实例 self,因为它的所有权也是 Root 实例的一部分:它是 Root 实例的组件(Tkinter 部分)触发事件更新。 然后,您可以将 self 作为按钮事件的参数:
def ok(self):
text_info(self.msglist.next())
buttonevent.do_event(self)
buttonevent.do_stuff(self)
然后您可以使 text_info 成为您类(class)的一部分:
class Root(object):
...
def text_info(self, msg):
self.textinfo.configure(state='normal')
self.textinfo.insert(Tkinter.END, msg)
self.textinfo.see(Tkinter.END)
并将按钮事件更改为:
def do_event(root_instance):
# do something
root_instance.text_info(msg.next())
关于Python:如何从模块访问类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38717058/