I am building a GUI for a hand tracking app using PyQT5.
There are two windows: one 'MainWindow' which displays the camera view, and one called 'Window 2' which holds multiple checkboxes that correspond to actions that can be enabled/disabled while the program is running.
The code for the two classes is as follows:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
loadUi("window1.ui", self)
self.setWindowTitle("Tracker")
self.display_width = 640
self.display_height = 480
# start the thread
self.gesture.clicked.connect(self.gotowindow2)
self.startbutton.clicked.connect(self.startvideo)
def gotowindow2(self):
widget.setCurrentIndex(widget.currentIndex() 1) # changes index by 1 to change page
def startvideo(self):
# Change label color to light blue
self.startbutton.clicked.disconnect(self.startvideo)
# Change button to stop
self.startbutton.setText('Stop video')
values = Window2()
hello = values.returnvalues()
print(hello)
self.thread = VideoThread(1,1,0)
self.thread.change_pixmap_signal.connect(self.update_image)
# start the thread
self.thread.start()
self.startbutton.clicked.connect(self.thread.stop) # Stop the video if button clicked
self.startbutton.clicked.connect(self.stopvideo)
def stopvideo(self):
self.thread.change_pixmap_signal.disconnect()
self.startbutton.setText('Start video')
self.startbutton.clicked.disconnect(self.stopvideo)
self.startbutton.clicked.disconnect(self.thread.stop)
self.startbutton.clicked.connect(self.startvideo)
def closeEvent(self, event):
self.thread.stop()
event.accept()
@pyqtSlot(np.ndarray)
def update_image(self, img):
"""Updates the image_label with a new opencv image"""
qt_img = self.convert_cv_qt(img)
self.image_label.setPixmap(qt_img)
def convert_cv_qt(self, img):
"""Convert from an opencv image to QPixmap"""
rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
bytes_per_line = ch * w
convert_to_Qt_format = QtGui.QImage(rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
p = convert_to_Qt_format.scaled(self.display_width, self.display_height, Qt.KeepAspectRatio)
return QPixmap.fromImage(p)
class Window2(QWidget):
def __init__(self):
super(Window2, self).__init__()
loadUi("window2.ui", self)
self.backbutton.clicked.connect(self.returnvalues)
self.backbutton.clicked.connect(self.gotowindow1)
self.outputbutton.clicked.connect(self.printvalues)
def printvalues(self):
print(self.returnvalues())
def gotowindow1(self):
widget.setCurrentIndex(widget.currentIndex() - 1)
def returnvalues(self):
left = self.leftclickbutton.isChecked()
scrollup = self.scrollupbutton.isChecked()
scrolldown = self.scrolldownbutton.isChecked()
checkboxvalues = [left, scrollup, scrolldown]
return checkboxvalues
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = QtWidgets.QStackedWidget()
a = MainWindow()
b = Window2()
widget.resize(1000, 600)
widget.addWidget(a)
widget.addWidget(b)
widget.show()
sys.exit(app.exec_())
My problem is that when I check the checkboxes and press the "outputbutton", it correctly displays the three values.
When these values are fetched by hello = values.returnvalues()
, it is always [False, False, False]
How can the correct values get passed into class "MainWindow" stored under variable "hello"
CodePudding user response:
It seems like you are not familier with Object oriented programmation ?
values = Window2()
hello = values.returnvalues()
This block of code actually create a new object Window2, and its checkboxes are indeed unchecked, which is why you always get [False, False, False].
The simplest (but not the best) way to solve your problem would be to give your Window2 instance to your mainWindow.
So instead of :
a = MainWindow()
b = Window2()
you do :
b = Window2()
a = MainWindow(b)
Instead of :
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
you do :
class MainWindow(QMainWindow):
def __init__(self, window_2):
super(MainWindow, self).__init__()
self.window_2 = window_2
and instead of :
values = Window2()
hello = values.returnvalues()
you do :
hello = self.window_2.returnvalues()