2016-09-09 67 views
-1

我有一個基類,QLineEdit的,這僅僅是一個可編輯的文本框從PyQt5的一個簡單的子類:Python:如何訪問PyQt中已經實例化的類對象?

class pQLineEdit(QtWidgets.QLineEdit): 
    def __init__(self, parent = None): 
     QtWidgets.QWidget.__init__(self,parent) 

    def mouseDoubleClickEvent(self,e): 
     self.setText("Test") 

此類工作正常。當我雙擊它時,對象的文本確實會更新。

但是,在這個事件中,我需要從另一個文件中另一個已經實例化的類訪問一個對象foo.bar。我怎樣才能做到這一點?我曾嘗試

import other_file 
... 
def mouseDoubleClickEvent(self,e): 
    self.setText("Test") 
    foo.bar 

我得到:

NameError: global name 'foo' is not defined 

我已經試過黑客只是利用

eval("foo.bar") 

我的方式,但它抱怨foo.bar沒有定義。我覺得這很簡單,但答案沒有回答。

我應該澄清一點:foo()是在另一個文件main()中的FUNCTION中實例化的類。我必須訪問實例化的類,因爲它包含一個SSH隧道。我不認爲我的問題是列舉出來的。

+0

您需要更具體地瞭解其他對象以及它所在的模塊。您需要將該對象存儲在事件處理程序可以訪問的地方。這可能需要從包含處理程序的模塊導入包含「foo.bar」的模塊。 – BrenBarn

+0

這似乎並不是一個pyqt問題,而是一個非常基本的python問題,已經在這裏得到解答。例如http://stackoverflow.com/questions/15168024/python-access-objects-from-another-module – neuronet

回答

1

冒着明顯的風險:如果你想訪問一個變量,你需要把它放在一個可訪問的地方。該函數之外的任何代碼都無法訪問該函數的局部範圍。

要使另一個模塊可以訪問變量,必須在全局範圍內分配變量,或者將其指定爲全局範圍內另一個對象的屬性。

如果變量不能分配被裝載模塊時,使用global語句定義它:

foo = None 

def main(): 
    global foo 
    foo = MyClass() 
    ... 

然而,對於一個GUI應用程序更合適的方法將是對於頂層窗口來提供訪問變量:

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.foo = MyClass() 

具有主窗口作爲其父然後可以通過其parent()方法訪問變量不限子部件:

class LineEdit(QtWidgets.QLineEdit): 
    def __init__(self, parent=None): 
     super(LineEdit, self).__init__(parent) 

    def mouseDoubleClickEvent(self, event): 
     bar = self.parent().foo.bar 

PS

請注意,如果你把線編輯在佈局中,它會自動重新父佈局的父。在QMainWindow中,這可能是中心部件。在這種情況下,您應該在中央窗口小部件上設置屬性,或使用self.parent().parent()檢索主窗口。

+0

謝謝!但不幸的是,最後一個建議雖然有意義,但卻不起作用:它說AttributeError:'QWidget'對象沒有屬性'foo'。但是foo肯定是一個在類MainWindow中聲明的函數,就像你的例子。我不知道它爲什麼找不到它? – user2022444

+0

@ user2022444。看到我更新的答案。 – ekhumoro

+0

非常感謝!就是這樣! – user2022444

相關問題