Возврат значения из нового окна в pyqt5 - PullRequest
0 голосов
/ 29 марта 2020

Я хотел открыть новое окно, нажав на кнопку и введите число в новом окне. После этого при нажатии на кнопку «ОК» второе окно будет закрыто, и на этикетке будет показано написанное число, существовавшее в исходном окне. Я написал следующий код, но он пишет 0 в метке и не обновляет. Первое окно:

from PyQt5 import QtCore, QtWidgets
from load3D import load3

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(316, 284)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(60, 60, 191, 121))
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label.setText("")
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(60, 190, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 316, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        self.pushButton.clicked['bool'].connect(self.get_value)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def get_value(self):
        length = self.load3load()
        self.label.setText(str(length))

    def load3load(self):    
        self.MainWindow = QtWidgets.QMainWindow()
        self.x = 0
        self.ui = load3(self.x)
        self.ui.setupUi(self.MainWindow)
        self.MainWindow.show()
        return self.ui.x

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Click"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

И второе окно:

from PyQt5 import QtCore, QtGui, QtWidgets


class load3(object):
    def __init__(self, x):
        self.x = 0

    def setupUi(self, MainWindow):   

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(283, 340)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 40, 71, 31))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(90, 47, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        font = QtGui.QFont()
        font.setPointSize(18)
        self.buttonBox = QtWidgets.QDialogButtonBox(self.centralwidget)
        self.buttonBox.setGeometry(QtCore.QRect(120, 260, 156, 23))

 self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 283, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.accepted.connect(MainWindow.close)
        self.buttonBox.rejected.connect(MainWindow.close)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def accept(self):
        self.x = self.lineEdit.text()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Image properties"))
        self.label.setText(_translate("MainWindow", "X:"))

Есть мысли, как заставить это работать?

1 Ответ

0 голосов
/ 29 марта 2020

Прежде всего, вы должны никогда редактировать файлы, созданные с помощью pyuic. Они предназначены для использования только в качестве импортируемого модуля. Узнайте больше о , используя Designer , чтобы понять, как правильно их использовать.

Второе: если вам нужен ввод от пользователя из другого окна, вы должны использовать QDialog , не QMainWindow.

Тогда, если вам нужно только простое входное значение, используйте QInputDialog , возможно, из одного из его методов stati c, в вашем случае getInt() будет достаточно.

Наконец, причина, по которой ваш код не работает, заключается в том, что после создания и отображения окна вы сразу получаете значение x, но после этого функция немедленно возвращается, так как нет ничего, что "блокировало бы" это (таким образом это не будет ждать любого ввода от пользователя). Вот для чего нужны QDialogs: они ждут от пользователя ввода перед возвратом.

Если у вас больше нет файлов .ui, создайте их заново, а затем снова сгенерируйте файлы python с помощью pyui c и оставьте их там .

Предположим, что вы создали файл с именем ui_mainwindow.py для основного окна и ui_inpudialog.py для диалога со спинбоксом ( не * 1031) * редактирование строки, так как вам нужно числовое значение c) и кнопка:

from PyQt5 import QtWidgets
from ui_mainwindow import Ui_MainWindow
from ui_inputdialog import Ui_Dialog

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.get_value)

    def get_value(self):
        dialog = InputDialog(self)
        # this will show the dialog and wait for the user to accept or reject it
        if dialog.exec():
            # get the value from the dialog
            self.label.setText(str(dialog.getValue()))


class InputDialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

    def getValue(self):
        # return the current value of the spinbox
        return self.spinBox.value()

В качестве альтернативы, если вам не требуется заданная c настройка диалогового окна ввода, просто используйте QInputDialog как предложил раньше:

from PyQt5 import QtWidgets
from ui_mainwindow import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.get_value)

    def get_value(self):
        length = QtWidgets.QInputDialog.getInt(self, 'Insert value', 'Value', 
            min=0, max=100)
        self.label.setText(str(length))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...