2016-07-10 4 views
1

私の問題をよりよく理解するためのコードを省略しました。問題は、パブリックメソッドのようなものを作成する方法と、OOPの概念を完全に誤解しているかどうか、あるいはどうやって作成するかということです。クラス内のPythonパブリックメソッド?

私にはビデオを再生するメジャークラスPlayerWindowがあります。その後、私の開発、テスト、およびメンテナンスの目的でのみ提供されるクラスControlsWindowがあります(フルスクリーンオフ時に起動されます)。それゆえ、私は特にそれになりたいです。私がControlsWindowのインスタンスをPlayerWindowで初期化すると、無限ループになるので、ControlsWindowクラスからメソッドplay()を呼び出す方法を知ることができません。

class ControlsWindow(QtGui.QWidget): 

    def __init__(self): 
    super(ControlsWindow, self).__init__() 

    self.playPauseButton = QtGui.QPushButton('Play', self) 
    self.show() 


class PlayerWindow(QtGui.QWidget): 

    def __init__(self): 
    super(PlayerWindow, self).__init__() 

    # ... 
    self.mediaPlayer = self.playerInstance.media_player_new() 
    # ... 
    self.initUI() 
    self.play() 

    def initUI(self): 
    # ... 
    self.show() 
    self.controls_window = ControlsWindow()   

    def keyPressEvent(self, e): 
    if e.key() == QtCore.Qt.Key_Return: 
     self.toggleControlsWindow() 

    def toggleControlsWindow(self): 
    if self.isFullScreen(): 
     self.showNormal() 
     self.controls_window = ControlsWindow()  
    else: 
     self.controls_window.close()   
     self.showFullScreen() 

    def play(self): 
    self.mediaPlayer.play() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    player_window = PlayerWindow() 

    sys.exit(app.exec_())    


if __name__ == "__main__": 
    main() 

答えて

1

あなたはControlsWindowのクラスのコンストラクタにPlayerWindowのインスタンスを渡すことができます。

class ControlsWindow(QtGui.QWidget): 

    def __init__(self, parent): # Notice the new parent argument 
    super(ControlsWindow, self).__init__() 
    self.parent = parent 

    self.playPauseButton = QtGui.QPushButton('Play', self) 
    self.show() 

    # Now you can call the parent's (PlayerWindow) play() function: 
    self.parent.play() 


class PlayerWindow(QtGui.QWidget): 

    def __init__(self): 
    super(PlayerWindow, self).__init__() 

    # ... 
    self.mediaPlayer = self.playerInstance.media_player_new() 
    # ... 
    self.initUI() 
    self.play() 

    def initUI(self): 
    # ... 
    self.show() 
    self.controls_window = ControlsWindow(self) # Pass a reference of PlayerWindow 

    def keyPressEvent(self, e): 
    if e.key() == QtCore.Qt.Key_Return: 
     self.toggleControlsWindow() 

    def toggleControlsWindow(self): 
    if self.isFullScreen(): 
     self.showNormal() 
     self.controls_window = ControlsWindow(self) # Pass a reference of PlayerWindow 
    else: 
     self.controls_window.close()   
     self.showFullScreen() 

    def play(self): 
    self.mediaPlayer.play() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    player_window = PlayerWindow() 

    sys.exit(app.exec_())    


if __name__ == "__main__": 
    main() 

は、この情報がお役に立てば幸い!

Actual.playを作る:あなたはあなたができるいずれかの内部TestクラスからActual.playメソッドを呼び出したい場合

# QtGui.QWidget 
class B: 
    pass 

# ControlsWindow 
class Test(B): 
    def __init__(self): 
     # You want to call Actual.play here? 
     pass 

# PlayerWindow 
class Actual(B): 
    def __init__(self): 
     # Your self.mediaPlayer = self.playerInstance.media_player_new() 
     self.some_variable = 42 

    def play(self): 
     print(self.some_variable) 

+0

はい、これは私が探しているものです!どうもありがとう! –

1

私が正しくあなたを理解し、あなたのコードは、のようなものに単純化することができると仮定すると、静的およびself.mediaPlayerクラス変数

class Test(B): 
    def __init__(self): 
     # Here you go! 
     Actual.play() 

class Actual(B): 
    # mediaPlayer = self.playerInstance.media_player_new() 
    some_variable = 42 

    def __init__(self): 
     pass 

    @staticmethod 
    def play(): 
     print(Actual.some_variable) 

または参照を渡す〜PlayerWindowにオブジェクトControlsWindowクラスインスタンス

class B: 
    pass 

class Test(B): 
    def __init__(self, actual: Actual): 
     # Here you go! 
     actual.play() 

class Actual(B): 
    def __init__(self): 
     self.some_variable = 42 

    def play(self): 
     print(self.some_variable) 
+0

便利なソリューションです!私は感謝します。ありがとう –

関連する問題