Как приостанавливать выполнение скрипта в 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 шт):
Я НЕ работаю во встроенном 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_())
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")
S. Nick, да, я запускал Ваш пример, как раз по поводу него я и написал комментарий выше, в котором в качестве примера добавил в конец кода функцию print(), которая не должна выполняться, пока окно Radiobutton активно в ожидании выбора страны, но она, несмотря на это, выполняется. Может, конечно, это из-за того, что я использую консоль встроенного в QGIS python-редактора. С другой стороны, я использую в нем, к примеру, диалоговое окно QInputDialog().getItem(), и пока оно активно, выполнение скрипта приостанавливается.
Проблема решилась добавлением 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())

