Python:如何从模块访问类的属性

标签 python tkinter attributeerror

我有一个主文件,其中主要包含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'
  1. 如何从不同的 py 文件调用主 py 文件中的函数。
  2. 最好的方法是什么,我应该在 main.c 文件中为 text_info 使用 class 还是 function 吗? py 文件
  3. 如果这不是正确的编码方式,请纠正我。

最佳答案

您可以通过将 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/

相关文章:

python - 如何获取实例的名称来影响 tkinter 标签

python - 无法使用 __exit__ 方法创建mockito模拟

python - numpy.dot -> MemoryError, my_dot -> 非常慢,但有效。为什么?

python - opencv中读取并显示多张图像

python - 动态创建 lambda 函数列表,其中每个下一个函数都使用前一个函数

python - “QMainWindow”对象没有属性 'addWidget'

Python: AttributeError: 'module' 对象没有属性 'WD_BREAK'

python - 使用 Python 列出可用 Virtualbox 虚拟机的名称

python - Tkinter 小部件彼此相邻且位于下方

python - 节食 py2exe 和 matplotlib