Как показать новый QMainWindow в каждом цикле в PyQT5? - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь написать программу на Python, использующую PyQt5, которая будет отображать окно в каждой итерации цикла for. Я хотел бы закрыть после увеличения и отображения следующего окна. Однако я не знаю, как останавливать цикл каждую итерацию, и в настоящее время я получаю 6 окон одновременно.

main.py

import sys
from PyQt5.QtWidgets import (QLineEdit, QVBoxLayout, QMainWindow, 
    QWidget, QDesktopWidget, QApplication, QPushButton, QLabel, 
    QComboBox, QFileDialog, QRadioButton)
from PyQt5.QtCore import pyqtSlot, QByteArray
from alert import Window2
from test import test

class SG(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300, 150)
        self.setWindowTitle('TEST')

        self.resultsGen = QPushButton('TEST', self)
        self.resultsGen.clicked.connect(lambda: self.on_click())

        self.show()

    @pyqtSlot()
    def on_click(self):
        test(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sg = SG()

    sys.exit(app.exec_())

alert.py

from PyQt5.QtWidgets import (QLineEdit, QVBoxLayout, QMainWindow, 
    QWidget, QDesktopWidget, QApplication, QPushButton, QLabel, 
    QComboBox, QFileDialog, QRadioButton)
from PyQt5.QtCore import pyqtSlot, QByteArray
from PyQt5.QtGui import QPixmap

from PyQt5 import QtGui, QtCore

class Window2(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        self.setWindowTitle("Window22222")
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        lay = QVBoxLayout(self.central_widget)

        label = QLabel(self)
        pixmap = QPixmap('cropped/8.png')
        label.setPixmap(pixmap)
        self.resize(pixmap.width(), pixmap.height())

        lay.addWidget(label)

        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(280, 40)

        # Create a button in the window
        self.button = QPushButton('Show text', self)
        self.button.move(20, 80)
        # connect button to function on_click
        self.button.clicked.connect(lambda: self.on_clickX())
        self.show()

    @pyqtSlot()
    def on_clickX(self):
        textboxValue = self.textbox.text()
        print(textboxValue)
        self.textbox.setText("")
        self.hide()

test.py

from alert import Window2

def test(self):
    for x in range(6):
        w = Window2()

1 Ответ

0 голосов
/ 12 ноября 2019

Как только вы запустите цикл for, будет выполнен весь код инициализации, который включает в себя вызов show(), который вы использовали в конце initPopup().

Простое решение состоит в том, чтобысоздайте новый сигнал, который излучается всякий раз, когда вы скрываете окно, и подключите этот сигнал к функции, которая создает новый, пока не достигнет максимального числа.

main.py:

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
from alert import Window2

class SG(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.alerts = []

    def initUI(self):
        self.resize(300, 150)
        self.setWindowTitle('TEST')

        self.resultsGen = QPushButton('TEST', self)
        self.resultsGen.clicked.connect(self.nextAlert)

        self.show()

    def nextAlert(self):
        if len(self.alerts) >= 6:
            return
        alert = Window2()
        self.alerts.append(alert)
        alert.setWindowTitle('Window {}'.format(len(self.alerts)))
        alert.closed.connect(self.nextAlert)
        alert.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sg = SG()

    sys.exit(app.exec_())

alert.py:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Window2(QMainWindow):
    closed = pyqtSignal()
    def __init__(self):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        lay = QVBoxLayout(self.central_widget)

        label = QLabel(self)
        pixmap = QPixmap('cropped/8.png')
        label.setPixmap(pixmap)
        self.resize(pixmap.width(), pixmap.height())

        lay.addWidget(label)

        self.textbox = QLineEdit(self)
        lay.addWidget(self.textbox)

        # Create a button in the window
        self.button = QPushButton('Show text', self)
        lay.addWidget(self.button)
        # connect button to function on_click
        self.button.clicked.connect(lambda: self.on_clickX())
        self.show()

    @pyqtSlot()
    def on_clickX(self):
        textboxValue = self.textbox.text()
        print(textboxValue)
        self.textbox.setText("")
        self.hide()
        self.closed.emit()

Просто обратите внимание, что в этом очень упрощенном примере пользователь может нажать на кнопку виджета «SG», даже если окно «alert» является видимым. Вы можете предпочесть использовать QDialog вместо QMainWindow и сделать основной виджет родительским этого диалога.

main.py:

class SG(QWidget):
    # ...
    def nextAlert(self):
        if len(self.alerts) >= 6:
            return
        alert = Window2(self)
        # ...

alert.py:

class Window2(QDialog):
    closed = pyqtSignal()
    def __init__(self, parent):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        # a QDialog doesn't need a central widget
        lay = QVBoxLayout(self)
        # ...

Кроме того, если окно предупреждения закрывается с помощью кнопки «X», новое не будет отображаться автоматически. Чтобы избежать этого, вы можете реализовать «closeEvent» и игнорировать событие, так что пользователь не сможет закрыть окно, пока не будет нажата кнопка. Поскольку QDialogs может закрывать себя при нажатии клавиши выхода, я также игнорирую эту ситуацию.

alert.py:

class Window2(QMainWindow):
    # ...
    def closeEvent(self, event):
        event.ignore()

    def keyPressEvent(self, event):
        if event.key() != Qt.Key_Escape:
            super().keyPressEvent(event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...