Reputation: 27
I wanted to open a new window by clicking on the pushbutton and type a number in the new window. After that when clicking on the "Ok" Button, the second window will be closed and the written number will be shown in the label, which was existed in the initial window. I wrote the following code but it writes 0 in the label and doesnt update. The first Window:
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_())
And The second window:
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:"))
Any thoughts how to make it work ?
Upvotes: 0
Views: 1710
Reputation: 48231
First of all, you should never edit the files generated with pyuic
. They are intended to be used only as imported module. Read more about using Designer to understand how use them properly.
Second: if you need an input from the user from another window, you should use a QDialog, not a QMainWindow.
Then, if you only need a simple input value, use QInputDialog, possibly from one of its static methods, in your case getInt()
will suffice.
Finally, the reason for which your code doesn't work is that after creating and showing the window you immediately get the x
value, but after that the function returns immediately, since there's nothing "blocking" it (so it won't wait for any input from the user). That's what QDialogs are for: they wait from some input from the user before returning.
If you don't have the .ui files anymore, recreate them, then generate again the python files with pyuic and leave them there.
Supposing you've created a file named ui_mainwindow.py
for the main window and ui_inpudialog.py
for a dialog with a spinbox (not a line edit, since you need a numeric value) and a buttonbox:
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()
Alternatively, if you don't need specific customization of the input dialog, just use QInputDialog as suggested before:
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))
Upvotes: 2