2014-11-24 87 views
-1

我有一個名爲TerminalPanel類有以下方法:如何從另一個類中獲取變量?

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

現在,我想從另一個類(GraphicsPanel)的另一種方法(get_data)獲得的text值。

我該如何得到這個值?我試過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: type object 'TerminalPanel' has no attribute 'text'

我在做什麼錯?

+0

提示文字,而不是類 – Yoriz 2014-11-24 13:31:04

回答

2

我覺得問題在於缺乏實際的背景和困惑。我想你會嘗試從pyserial返回wxTerminal.py。我不得不承認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 
+0

謝謝!你似乎得到了我想要做的事情,呵呵。哪個選項更正確? – 2014-11-24 14:30:09

+0

兩者都是「正確的」,從某種意義上說,它們將起作用。 - 版本1):您必須瞭解如何使用事件工作(雙重綁定,跳過)。 +版本1):清晰的範圍分離,解耦。 - 版本2):你必須保持對另一個面板(GraphicsPanel)+版本2的引用:沒有更深入的理解雙重綁定要求 – nepix32 2014-11-24 14:36:50

+0

好吧,看起來#2是我的huckleberry – 2014-11-24 14:40:23

1

該變量在函數範圍內定義。沒有辦法獲得這個價值。

爲了可以在任何的值的方法之外,你需要的值存儲在類self.text = event.data或返回值return text

你需要決定什麼是正確的,雖然這種情況,我猜通過返回數據的函數的名稱是正確的。

+0

我怎樣的價值? – 2014-11-24 12:16:45

+0

self.text將獲得該值,注意返回文本將不起作用,因爲綁定在事件觸發時調用處理函數。 – Yoriz 2014-11-24 13:23:05

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 
+0

我得到這個:'TypeError:unbound方法OnSerialRead()必須以TerminalPanel實例作爲第一個參數被調用(取而代之)' – 2014-11-24 12:19:50

+0

@ MarioS.E。抱歉!忘了補充一點,你需要一起發送活動。 – Willy 2014-11-24 12:20:44

+0

@ MarioS.E。但是我開始覺得這種方法只在事件發生時被調用?那麼第二種方法可能更適合。 – Willy 2014-11-24 12:22:27

相關問題