2016-07-10 12 views
1

Ich habe Code ausgeschnitten, um mein Problem besser zu verstehen. Die Frage ist, ob es einen Weg gibt, etwas wie öffentliche Methode zu erstellen und wie oder ob ich das OOP-Konzept total missverstanden habe.Python öffentliche Methoden in Klassen?

Ich habe eine große Klasse PlayerWindow, die nur Video spielt. Dann gibt es Klasse ControlsWindow, die nur für meine Entwicklungs-, Test- und Wartungszwecke dient (gestartet, wenn der Vollbildmodus ausgeschaltet ist). Deshalb möchte ich es besonders sein. Kann nicht herausfinden, wie man Methode play() von der ControlsWindow Klasse als auch von innen aufrufen, denn wenn ich ControlsWindow mit Instanz von PlayerWindow initialisiere, dann bekomme ich Endlosschleife.

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() 

Antwort

1

Sie können eine Instanz von PlayerWindow an den Konstruktor der Klasse von ControlsWindow passieren:

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() 

hoffe, das hilft!

+0

Ja, das ist genau das, was ich für mich aussehen! Danke vielmals! –

1

Unter der Annahme, dass ich Sie richtig verstanden und Ihr Code kann wie etwas vereinfacht werden:

# 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) 

Wenn Sie in Actual.play Methode aufrufen möchten von Test Klasse können Sie entweder:

Actual.play machen statische und self.mediaPlayer eine Klassenvariable

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) 

oder eine Referenz passieren zu PlayerWindow Objekt in die ControlsWindow Klasseninstanz

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

Ebenso nützliche Lösung! Ich schätze. Vielen Dank –

Verwandte Themen