我有一个名为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'
我做错了什么?
答案 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