Как работать с несколькими windows в PyQt5? Передача значений через несколько windows и вызывающих модулей в других модулях - PullRequest
0 голосов
/ 27 января 2020

Я создал GUI с PyQt5. У меня всего три windows. Первое окно имеет одну кнопку pu sh (**btn_OpenSecondWIndow**), которая открывает второе окно. Второе окно имеет одну кнопку pu sh (**btn_OpenCalendar**), которая открывает третье окно (Календарь). пользователь выбирает дату оттуда и выбирает кнопку (**btn_selecteddate**) в третьем окне, я хочу отобразить этот выбор в метке ( label_Date ) во втором окне.

Фрагмент для получения потока

Теперь я нахожусь в этой точке, где первое окно работает нормально, а второе открывается, но кнопки не работают.

Кнопка в второе окно ничего не делает, когда окно открывается из первого, но когда класс «SecondWindow» вызывается сам по себе, а не из первого окна, оно работает.

вот код:

from PyQt5 import QtWidgets
from FirstWindow import Ui_FirstWindow
from SecondWindow import Ui_SecondWindow
from Calendar import Ui_CalendarWindow

class Calendar(QtWidgets.QMainWindow, Ui_CalendarWindow):                    
    def __init__(self):
        super().__init__()
        self.setupUi(self) 

class FirstWindow(QtWidgets.QMainWindow, Ui_FirstWindow):                    
    def __init__(self):
        super(FirstWindow,self).__init__()
        self.setupUi(self)   
        self.btn_OpenSecondWIndow.clicked.connect(self.open_SecondWindow) 

    def open_SecondWindow(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = SecondWindow()
        self.ui.setupUi(self.window)
        self.window.show()  
        self.setEnabled(False)
        self.window.setEnabled(True)

class SecondWindow(QtWidgets.QMainWindow, Ui_SecondWindow):                    
    def __init__(self):
        super(SecondWindow, self).__init__()
        self.setupUi(self)  
        self.btn_OpenCalendar.clicked.connect(self.Open_Calendar)

    def Open_Calendar(self):
        self.window = Calendar()      
        self.window.setupUi(self.window)
        self.window.show()
        self.window.btn_Selecteddate.clicked.connect(self.PickedDate)

    def PickedDate(self):    
        self.selecteddate = self.window.CalendarBox.selectedDate() 
        self.label_Date.setText(self.selecteddate.toString('MMM')+'-'+self.selecteddate.toString('yyyy'))  
        self.window.hide()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = FirstWindow()    
    window.show()
    sys.exit(app.exec_())

Коды ссылочных Ui-классов приведены ниже:

Первое окно:

from PyQt5 import QtCore, QtWidgets


class Ui_FirstWindow(object):
    def setupUi(self, FirstWindow):
        FirstWindow.setObjectName("FirstWindow")
        FirstWindow.resize(380, 195)
        self.centralwidget = QtWidgets.QWidget(FirstWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_OpenSecondWIndow = QtWidgets.QPushButton(self.centralwidget)
        self.btn_OpenSecondWIndow.setGeometry(QtCore.QRect(80, 60, 221, 61))
        self.btn_OpenSecondWIndow.setObjectName("btn_OpenSecondWIndow")
        FirstWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(FirstWindow)
        self.statusbar.setObjectName("statusbar")
        FirstWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, FirstWindow):
        _translate = QtCore.QCoreApplication.translate
        FirstWindow.setWindowTitle(_translate("FirstWindow", "MainWindow"))
        self.btn_OpenSecondWIndow.setText(_translate("FirstWindow", "Open Second Window"))


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

Второе окно:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_SecondWindow(object):
    def setupUi(self, SecondWindow):
        SecondWindow.setObjectName("SecondWindow")
        SecondWindow.resize(654, 242)
        self.centralwidget = QtWidgets.QWidget(SecondWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_Date = QtWidgets.QLabel(self.centralwidget)
        self.label_Date.setGeometry(QtCore.QRect(330, 60, 281, 131))
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        self.label_Date.setFont(font)
        self.label_Date.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_Date.setObjectName("label_Date")
        self.btn_OpenCalendar = QtWidgets.QPushButton(self.centralwidget)
        self.btn_OpenCalendar.setGeometry(QtCore.QRect(80, 90, 191, 61))
        self.btn_OpenCalendar.setObjectName("btn_OpenCalendar")
        SecondWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(SecondWindow)
        self.statusbar.setObjectName("statusbar")
        SecondWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, SecondWindow):
        _translate = QtCore.QCoreApplication.translate
        SecondWindow.setWindowTitle(_translate("SecondWindow", "MainWindow"))
        self.label_Date.setText(_translate("SecondWindow", "Date"))
        self.btn_OpenCalendar.setText(_translate("SecondWindow", "Open Calendar"))

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

Третье окно (Календарь):

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_CalendarWindow(object):
    def setupUi(self, CalendarWindow):
        CalendarWindow.setObjectName("CalendarWindow")
        CalendarWindow.resize(512, 458)
        self.centralwidget = QtWidgets.QWidget(CalendarWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.CalendarBox = QtWidgets.QCalendarWidget(self.centralwidget)
        self.CalendarBox.setGeometry(QtCore.QRect(20, 20, 464, 289))
        self.CalendarBox.setObjectName("CalendarBox")
        self.btn_Selecteddate = QtWidgets.QPushButton(self.centralwidget)
        self.btn_Selecteddate.setGeometry(QtCore.QRect(160, 330, 181, 60))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_Selecteddate.setFont(font)
        self.btn_Selecteddate.setObjectName("btn_Selecteddate")
        CalendarWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(CalendarWindow)
        self.statusbar.setObjectName("statusbar")
        CalendarWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, CalendarWindow):
        _translate = QtCore.QCoreApplication.translate
        CalendarWindow.setWindowTitle(_translate("CalendarWindow", "MainWindow"))
        self.btn_Selecteddate.setText(_translate("CalendarWindow", "Select"))

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

Заранее спасибо. :)

1 Ответ

0 голосов
/ 27 января 2020

В FirstWindow.open_SecondWindow вам не нужно создавать отдельный QMainWindow объект для второго окна. SecondWindow() уже возвращает объект QMainWindow с соответствующим настроенным пользовательским интерфейсом и слотом, подключенным к btn_OpenCalendar для открытия окна календаря. Поэтому достаточно сделать что-то вроде:

def open_SecondWindow(self):
    self.window = SecondWindow()
    self.window.show()  
    self.setEnabled(False)
    self.window.setEnabled(True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...