如何从不同的类中获取变量?

时间:2014-11-24 12:14:27

标签: python wxpython

我有一个名为TerminalPanel的类,它有以下方法:

def OnSerialRead(self, event):
    """Handle input from the serial port."""
    text = event.data

现在,我想从另一个类(text)中的另一个方法(get_data)获取GraphicsPanel的值。

我如何获得此值?我尝试了marito = TerminalPanel.OnserialRead.text,但我得到了AttributeError: 'function' object has no attribute 'text'


更新

我已设置TerminalPanel类,以包含变量text作为其中的一部分:

def OnSerialRead(self, event):
    """Handle input from the serial port."""
    self.text = event.data

但是现在当我这样称呼marito = TerminalPanel.text我的GraphicsPanel类时,我收到以下错误:

  

AttributeError:类型对象'TerminalPanel'没有属性'text'

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我认为问题在于缺乏实际操作的背景和困惑。我想你试图从wxTerminal.py重新编写pyserial。我必须承认pyserial的这一部分既不是非常易读(由wxGlade创建)也不容易理解(需要了解wxPython事件系统并脱离线程(以便在读取串行端口时保持GUI响应) )。

但是,根据您的问题描述,在我看来您想要执行以下操作:

获取event.text到达后的值,并在GraphicsPanel个实例中进一步处理。

你有可能:

1)与事件结合:

GraphicsPanel课程中:

class GraphicsPanel(wx.Panel):
    def __init__(...):
        ...
        self.parent = self.GetParent() # this should result in a wx.Frame instance!
        # binding on wx.Frame required, because wx.Panel will not catch the event
        self.parent.Bind(EVT_SERIALRX, self.OnSerialRead)

    def OnSerialRead(self, event):
        text = event.text
        ...
        event.Skip() # important: you have to skip it also in ``TerminalPanel`` if you
        # want to bind twice 

2)使用GraphicsPanel作为参数调用event.text实例中的例程。

class TerminalPanel(wx.Panel):
    def __init__(...):
        ...
        self._grphpnl = GraphicsPanel(...)
        self.Bind(EVT_SERIALRX, self.OnSerialRead)

    def OnSerialRead(self, event):
        text = event.text
        # do something with it in GraphicsPanel instance
        self._grphpnl.OnSerialText(text)
        ...

代码中的其他地方:

class GraphicsPanel(wx.Panel):
    ...
    def OnSerialText(text):
        # do something with the text

答案 1 :(得分:1)

该变量在函数范围定义。没有办法获得这个价值。

要使值可用于方法之外的任何内容,您需要将值存储在类self.text = event.data上或返回值return text

你需要决定什么是适合这种情况的,我猜测函数的名称,返回数据是正确的。

答案 2 :(得分:1)

您需要返回值!

def OnSerialRead(self, event):
    """Handle input from the serial port."""
    text = event.data
    return text

然后你可以像这样访问

marito = TerminalPanel.OnserialRead(event)

或者保存班级中的值:

class Reader():
    def OnSerialRead(...):
        ...
        self.text = event.data

然后从类中访问该值:

marito = Reader.text