Как динамически переключать экраны с помощью заставки в pyqt5 - PullRequest
1 голос
/ 15 марта 2019

Я делаю приложение на python для переключения экранов на сенсорном дисплее.Мне нужно динамически переключать экраны с эффектом всплеска (а не с эффектом окна), но я не знаю, как переключать экраны.

У меня есть два класса экранов.Класс экрана имеет одну кнопку для переключения экранов.

Как переключать экраны?

Код:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class PicButton(QtWidgets.QPushButton):
    def __init__(self, pixmap, pixmap_pressed, width, height, id_button, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap
        self.pixmap_pressed = pixmap_pressed
        self.id_buton = id_button
        self.width = width
        self.height = height

    def paintEvent(self, event):
        if self.isDown():
            pix = self.pixmap_pressed
            print("Pressed button: ", self.id_buton)
        else:
            pix = self.pixmap

        painter = QtGui.QPainter(self)
        painter.drawPixmap(event.rect(), pix)

    def sizeHint(self):
        return QtCore.QSize(self.width, self.height)


class ScreenNext(QtWidgets.QWidget):
    def __init__(self):
        super().__init__(flags=QtCore.Qt.SplashScreen)

        self.setGeometry(800, 450, 800, 450)

        pixmap = QtGui.QPixmap("background.png")
        brush = QtGui.QBrush(pixmap)
        palette = QtGui.QPalette()
        palette.setBrush(QtGui.QPalette.Window, brush)
        self.setPalette(palette)

        self.next_button = PicButton(QtGui.QPixmap("next_screen_up.png"),
                                QtGui.QPixmap("next_screen_down.png"), 111, 61, "next")

        hlayout = QtWidgets.QHBoxLayout(self)
        hlayout.addStretch()
        hlayout.addWidget(self.next_button)
        hlayout.addStretch()

        self.next_button.clicked.connect(self.switch_screen)

        self.show()

    def switch_screen(self):
        print("ScreenNext")


class ScreenReturn(QtWidgets.QWidget):
    def __init__(self):
        super().__init__(flags=QtCore.Qt.SplashScreen)

        self.setGeometry(800, 450, 800, 450)

        pixmap = QtGui.QPixmap("background.png")
        brush = QtGui.QBrush(pixmap)
        palette = QtGui.QPalette()
        palette.setBrush(QtGui.QPalette.Window, brush)
        self.setPalette(palette)

        self.return_button = PicButton(QtGui.QPixmap("return_screen_up.png"),
                                QtGui.QPixmap("return_screen_down.png"), 111, 61, "return")

        hlayout = QtWidgets.QHBoxLayout(self)
        hlayout.addStretch()
        hlayout.addWidget(self.return_button)
        hlayout.addStretch()

        self.return_button.clicked.connect(self.switch_screen)

        self.show()

    def switch_screen(self):
        print("ScreenReturn")


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)

    screen = ScreenReturn()

    sys.exit(app.exec_())

Получить изображения по ссылке: http://www.filedropper.com/images_1

Получить демонстрацию GIF по ссылке: http://www.filedropper.com/display

1 Ответ

1 голос
/ 15 марта 2019

В соответствии с .gif, которым вы делитесь, вы хотите, чтобы виджет занимал весь экран, поэтому вы должны использовать showFullScreen, с другой стороны, лучше создать класс, который обрабатывает переход, в этом случае ScreenManager будет приниматьзаботиться о переходе, когда испускается связанный сигнал.

import sys
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets


class PicButton(QtWidgets.QPushButton):
    def __init__(self, pixmap, pixmap_pressed, width, height, id_button, parent=None):
        super(PicButton, self).__init__(parent)
        self.pixmap = pixmap
        self.pixmap_pressed = pixmap_pressed
        self.id_buton = id_button
        self.setFixedSize(width, height)

    def paintEvent(self, event):
        if self.isDown():
            pix = self.pixmap_pressed
            print("Pressed button: ", self.id_buton)
        else:
            pix = self.pixmap

        painter = QtGui.QPainter(self)
        painter.drawPixmap(event.rect(), pix)

class ScreenNext(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(800, 450, 800, 450)
        pixmap = QtGui.QPixmap("background.png")
        brush = QtGui.QBrush(pixmap)
        palette = QtGui.QPalette()
        palette.setBrush(QtGui.QPalette.Window, brush)
        self.setPalette(palette)
        self.next_button = PicButton(QtGui.QPixmap("next_screen_up.png"),
                                QtGui.QPixmap("next_screen_down.png"), 111, 61, "next")
        hlayout = QtWidgets.QHBoxLayout(self)
        hlayout.addStretch()
        hlayout.addWidget(self.next_button)
        hlayout.addStretch()

class ScreenReturn(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(800, 450, 800, 450)
        pixmap = QtGui.QPixmap("background.png")
        brush = QtGui.QBrush(pixmap)
        palette = QtGui.QPalette()
        palette.setBrush(QtGui.QPalette.Window, brush)
        self.setPalette(palette)
        self.return_button = PicButton(QtGui.QPixmap("return_screen_up.png"),
                                QtGui.QPixmap("return_screen_down.png"), 111, 61, "return")
        hlayout = QtWidgets.QHBoxLayout(self)
        hlayout.addStretch()
        hlayout.addWidget(self.return_button)
        hlayout.addStretch()


class ScreenManager(QtCore.QObject):
    def __init__(self, parent=None):
        super(ScreenManager, self).__init__(parent)
        self._current_window = None

    def add_transition(self, signal, screen):
        conn = signal.connect(partial(self.open_window, screen))

    def open_window(self, window, *args):
        if self._current_window is not None:
            self._current_window.hide()
        window.showFullScreen()
        self._current_window = window

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    screen1 = ScreenReturn()
    screen2 = ScreenNext()
    manager =  ScreenManager()
    manager.add_transition(screen1.return_button.clicked, screen2)
    manager.add_transition(screen2.next_button.clicked, screen1)
    screen1.showFullScreen()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...