2016-09-09 7 views
-1

私はPyQt5からちょうど編集可能なテキストボックスである基底クラス、にQLineEdit、の簡単なサブクラスを持っている: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にアクセスする必要があります。これどうやってするの?

NameError: global name 'foo' is not defined 

私はちょうど

eval("foo.bar") 

を使用して自分の道をハッキングしようとしました。しかし、それはfoo.barが定義されていない文句を言う:私は私が得る

import other_file 
... 
def mouseDoubleClickEvent(self,e): 
    self.setText("Test") 
    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

関連する問題