ждать действий пользователя для продолжения выполнения кода - PullRequest
1 голос
/ 14 июня 2019

Вот мой код:

from PySide.QtGui import *

class window_A(QWidget):
    def __init__(self):
        super(window_A, self).__init__()
        layout = QVBoxLayout() # Create horisontal layout
        self.setLayout(layout) # Use horisontal layout to place widgets in window
        self.resize(300,50) # resize window

        self.button_A = QPushButton('PRESS')
        self.button_A.clicked.connect(self.func)
        self.button_A.clicked.connect(self.close)
        layout.addWidget(self.button_A)

    def func(self):
        print 'A'


app = QApplication([])

print 'BEFORE'
widget = window_A()
widget.show()
print 'AFTER'

app.exec_()

Как можно удерживать выполнение кода после отображения окна до тех пор, пока пользователь не нажмет кнопку? Например. печатать «ПОСЛЕ» только после нажатия кнопки и закрытия окна.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

В этом случае для предотвращения продолжения синхронного выполнения вы можете использовать QEventLoop, а для уведомления, если окно закрыто, вы можете реализовать сигнал, который излучается в closeEvent:

from PySide import QtCore, QtGui


class Window_A(QtGui.QWidget):
    closed = QtCore.Signal()

    def __init__(self):
        super(Window_A, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self.resize(300, 50)

        self.button_A = QtGui.QPushButton("PRESS")
        self.button_A.clicked.connect(self.func)
        self.button_A.clicked.connect(self.close)
        layout.addWidget(self.button_A)

    @QtCore.Slot()
    def func(self):
        print("A")

    def closeEvent(self, event):
        super(Window_A, self).closeEvent(event)
        self.closed.emit()


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    print("BEFORE")
    widget = Window_A()
    widget.show()
    loop = QtCore.QEventLoop()
    widget.closed.connect(loop.quit)
    loop.exec_()
    print("AFTER")
0 голосов
/ 14 июня 2019

У меня есть решение!Нужно изменить QWidget на QDialog и show на exec_():

from PySide.QtGui import *

class window_A(QDialog):
    def __init__(self):
        super(window_A, self).__init__()
        layout = QVBoxLayout() # Create horisontal layout
        self.setLayout(layout) # Use horisontal layout to place widgets in window
        self.resize(300,50) # resize window

        self.button_A = QPushButton('PRESS')
        self.button_A.clicked.connect(self.func)
        self.button_A.clicked.connect(self.close)
        layout.addWidget(self.button_A)

    def func(self):
        print 'A'
        self.done(256)


app = QApplication([])
print 'BEFORE'
widget = window_A()
if widget.exec_() == 256:
    print 'AFTER'
app.exec_()
...