2016-07-10 4 views
1

Я вырезал код для лучшего понимания моей проблемы. Вопрос в том, есть ли какой-то способ создания чего-то вроде общественного метода и того, как я или полностью ли понял концепцию ООП.Публичные методы Python внутри классов?

У меня есть класс PlayerWindow, который воспроизводит только видео. Тогда есть класс ControlsWindow, который работает только для моих целей разработки, тестирования и обслуживания (запускается при выключенном полноэкранном режиме). Поэтому я хочу быть именно этим. Не могу понять, как вызвать метод play() из класса ControlsWindow, а также изнутри, потому что когда я инициализирую ControlsWindow с экземпляром PlayerWindow, тогда я получаю бесконечный цикл.

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

Вы можете передать экземпляр PlayerWindow классу конструктору ControlsWindow:

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

Надеется, что это помогает!

+0

Да, это именно то, что я искал! Большое спасибо! –

1

Предполагая, что я вас правильно понял, и ваш код может быть упрощена, что-то вроде:

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

Если вы хотите позвонить Actual.play метод из внутри Test класса вы можете:

сделать Actual.play статические и 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

Полезное решение! Я ценю. благодаря –

Смежные вопросы