2016-09-09 66 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

相关问题