Как приостанавливать выполнение скрипта в PyQGIS, пока активно окно radiobutton / checkable_combobox и не осуществлен выбор?

Я работаю во встроенном python-редакторе QGIS и в некоторых скриптах хотелось бы использовать radiobutton либо checkable_combobox, но при запуске таких окон интерпретатор продолжает выполнение скрипта, не давая возможности осуществить выбор и использовать его далее в коде.

Подскажите, пожалуйста, способ останавливать выполнение скрипта, пока активно окно radiobutton/chekable_combobox, чтобы выбрать нужные пункты/строки, а после закрытия окна продолжить выполнение скрипта.

from PyQt5.QtWidgets import *
import sys

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        layout = QGridLayout()
        self.setLayout(layout)

        radiobutton = QRadioButton("Australia")
        radiobutton.setChecked(True)
        radiobutton.country = "Australia"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 0)

        radiobutton = QRadioButton("China")
        radiobutton.country = "China"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 1)

        radiobutton = QRadioButton("Japan")
        radiobutton.country = "Japan"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 2)
   def onClicked(self):
       radioButton = self.sender()
       if radioButton.isChecked():
           print("Country is %s" % (radioButton.country))


screen = Window()
screen.show()

Ответы (4 шт):

Автор решения: S. Nick

Я НЕ работаю во встроенном python-редакторе QGIS, но предложить вам могу следующее:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtGui import QFont

class Window(QWidget):
    def __init__(self, parent=None):                          # +
#        super().__init__()
        super(Window, self).__init__(parent, Qt.Window)       # +
        
        self.parent = parent                                  # +
        self.country = None                                   # +
        
        layout = QGridLayout()
        self.setLayout(layout)

        radiobutton = QRadioButton("Australia")
#        radiobutton.setChecked(True)                          # -
        radiobutton.country = "Australia"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 0)

        radiobutton = QRadioButton("China")
        radiobutton.country = "China"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 1)

        radiobutton = QRadioButton("Japan")
        radiobutton.country = "Japan"
        radiobutton.toggled.connect(self.onClicked)
        layout.addWidget(radiobutton, 0, 2)
        
    def onClicked(self, v):
        radioButton = self.sender()
        if radioButton.isChecked():
            print("Country is %s" % (radioButton.country))
            self.country = f"Country is {radioButton.country}"   # +
            
    def closeEvent(self, event):                                 # +
        self.parent.timer.start()
            

class MyWin(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.label = QLabel(QTime.currentTime().toString())
        self.button = QPushButton("Выбрать страну")
        self.button.clicked.connect(self.openWindow)
        
        mainLayout = QVBoxLayout(self.centralWidget)
        mainLayout.addWidget(self.label)
        mainLayout.addWidget(self.button)
        
        self.window = Window(self)
        
        self.timer = QTimer(self)
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.changeContent)
        self.timer.start()

    def openWindow(self):
        self.timer.stop()
        self.window.show()
        
    def changeContent(self):
        if self.window.country is None:
            self.timer.stop()
        else:
            self.label.setText(f"{QTime.currentTime().toString()}, {self.window.country}")
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setFont(QFont("Times", 12))
    screen = MyWin()
    screen.resize(600, 400)
    screen.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка
Автор решения: user13892757

S. Nick, спасибо, но, видимо, я все равно делаю что-то не так, потому что если добавлю в конец кода, к примеру, функцию print(), то она выполняется, не дождавшись, пока я выберу страну. И переменная name у меня равна "console", а модуль sys не содержит атрибута 'argv', поэтому некоторые строки мне пришлось закомментировать.

#if __name__ == '__main__':
if __name__ == '__console__':
    #app = QApplication(sys.argv)
    #app.setFont(QFont("Times", 12))
    screen = MyWin()
    screen.resize(600, 400)
    screen.show()
    #sys.exit(app.exec_())


print("Эта строка не должна была появиться, т.к. активно окно Radiobutton")

Скриншот

→ Ссылка
Автор решения: user13892757

S. Nick, да, я запускал Ваш пример, как раз по поводу него я и написал комментарий выше, в котором в качестве примера добавил в конец кода функцию print(), которая не должна выполняться, пока окно Radiobutton активно в ожидании выбора страны, но она, несмотря на это, выполняется. Может, конечно, это из-за того, что я использую консоль встроенного в QGIS python-редактора. С другой стороны, я использую в нем, к примеру, диалоговое окно QInputDialog().getItem(), и пока оно активно, выполнение скрипта приостанавливается.

→ Ссылка
Автор решения: user13892757

Проблема решилась добавлением checkable_combobox в диалоговое окно (для radiobutton аналогично). Код на примере QgsCheckableComboBox(): https://gis.stackexchange.com/questions/376901/how-to-put-qgscheckablecombobox-into-standby

from qgis.PyQt import QtGui
from qgis.core import *
planet_list = ["Venus", "Earth", "Mars", "Jupiter", "Pluto"]
items = QgsCheckableComboBox()
items.addItems(planet_list)
dlg = QDialog()
layout = QVBoxLayout()
layout.addWidget(items)
dlg.setLayout(layout)
dlg.exec_()
print('\n\n-----------CheckedItems: ', items.checkedItems())
→ Ссылка