how can I make the code work in a way that when I click the proceed button, the 'select time' page appears but the calendar page hides?
As it appears that when I click the proceed button, both pages are open.
The expected output was that only one page opens at a time!!
My code:
class Window(QWidget):
def __init__(self):
super().__init__()
self.window = QWidget()
self.title = "Select date from calendar"
self.left, self.top, self.width, self.height = 600, 100, 500, 480
self.iconName = "Ok.png" # <--- home.png
self.setWindowTitle(self.title)
self.setWindowIcon(QtGui.QIcon(self.iconName))
self.setGeometry(self.left, self.top, self.width, self.height)
self.calendar = QCalendarWidget()
self.calendar.setGridVisible(True)
self.calendar.selectionChanged.connect(self.onSelectionChanged)
self.label = QLabel()
self.label.setFont(QtGui.QFont("Sanserif", 10))
self.label.setStyleSheet('color: blue;')
self.proceedbutton = QPushButton("Proceed to select time", self)
self.proceedbutton.setToolTip("<h3>Start the Session</h3>")
self.proceedbutton.setEnabled(False)
self.proceedbutton.clicked.connect(self.window2)
self.show()
self.hide()
self.backbutton = QPushButton("Back", self)
self.backbutton.setToolTip("<h3>Start the Session</h3>")
self.comboBox = None
self.grid = QtWidgets.QGridLayout(self)
self.grid.addWidget(self.calendar, 0, 0, 1, 3)
self.grid.addWidget(self.label, 1, 0, 1, 3)
self.grid.addWidget(self.backbutton, 2, 1, 1, 1)
self.grid.addWidget(self.proceedbutton, 2, 2, 1, 1)
def window2(self):
self.window.setWindowTitle("Select Time")
self.window.setGeometry(self.left / 3, self.top, self.width / 3, self.height / 3)
self.label = QLabel("Select Time")
self.comboBox = QtWidgets.QComboBox()
self.comboBox.addItems(["choose time", "0700", "0800", "0900", "1000", "1100", "1200", "1300",
"1400", "1500","1600","1700","1800","1900","2000","2100", "2200"])
self.comboBox.activated[str].connect(self.onComboActivated)
layout = QFormLayout(self.window)
layout.addRow('Choose Time', self.comboBox)
self.window.show()
def onSelectionChanged(self):
ca = self.calendar.selectedDate()
self.label.setText(ca.toString())
self.proceedbutton.setEnabled(True)
def onComboActivated(self, text):
print("choose time: {}".format(text))
if __name__ == '__main__':
App = QApplication([])
window = Window()
window.show()
sys.exit(App.exec())
This code uses QStackedWidget
to replace content in one window.
It has two functions to create two widgets with content - and they are put in stack QStackedWidget
.
First it uses self.stack.setCurrentIndex(0)
to show widget with calendara and button which runs function with self.stack.setCurrentIndex(1)
to show widget with time. This widget also has button which runs again self.stack.setCurrentIndex(0)
to show again calendar.
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.left, self.top, self.width, self.height = 600, 100, 500, 480
self.page1 = self.create_page1()
self.page2 = self.create_page2()
self.stack = QStackedWidget()
self.stack.addWidget(self.page1)
self.stack.addWidget(self.page2)
hbox = QHBoxLayout(self)
hbox.addWidget(self.stack)
self.setLayout(hbox)
self.show_page1()
self.show()
def create_page1(self):
page = QWidget()
#self.iconName = "Ok.png" # <--- home.png
#self.setWindowIcon(QtGui.QIcon(self.iconName))
page.calendar = QCalendarWidget(page)
page.calendar.setGridVisible(True)
page.calendar.selectionChanged.connect(self.onSelectionChanged)
page.label = QLabel(page)
#page.label.setFont(QtGui.QFont("Sanserif", 10))
page.label.setStyleSheet('color: blue;')
page.proceedbutton = QPushButton("Proceed to select time", page)
page.proceedbutton.setToolTip("<h3>Start the Session</h3>")
page.proceedbutton.setEnabled(False)
page.proceedbutton.clicked.connect(self.show_page2)
page.backbutton = QPushButton("Back", page)
page.backbutton.setToolTip("<h3>Start the Session</h3>")
page.comboBox = None
page.grid = QGridLayout(page)
page.grid.addWidget(page.calendar, 0, 0, 1, 3)
page.grid.addWidget(page.label, 1, 0, 1, 3)
page.grid.addWidget(page.backbutton, 2, 1, 1, 1)
page.grid.addWidget(page.proceedbutton, 2, 2, 1, 1)
return page
def create_page2(self):
page = QWidget()
layout = QFormLayout(page)
page.comboBox = QComboBox(page)
page.comboBox.addItems(["choose time", "0700", "0800", "0900", "1000", "1100", "1200", "1300",
"1400", "1500","1600","1700","1800","1900","2000","2100", "2200"])
page.comboBox.activated[str].connect(self.onComboActivated)
layout.addRow('Choose Time', page.comboBox)
page.proceedbutton = QPushButton("Back", page)
page.proceedbutton.clicked.connect(self.show_page1)
layout.addRow(page.proceedbutton)
return page
def show_page1(self):
self.setWindowTitle("Select date from calendar")
self.setGeometry(self.left, self.top, self.width, self.height)
self.stack.setCurrentIndex(0)
def show_page2(self):
self.setWindowTitle("Select Time")
self.setGeometry(self.left / 3, self.top, self.width / 3, self.height / 3)
self.stack.setCurrentIndex(1)
def onSelectionChanged(self):
ca = self.page1.calendar.selectedDate()
self.page1.label.setText(ca.toString())
self.page1.proceedbutton.setEnabled(True)
def onComboActivated(self, text):
print("choose time: {}".format(text))
if __name__ == '__main__':
App = QApplication([])
window = Window()
window.show()
sys.exit(App.exec())
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.