Сохранение значения checkbox после закрытия и изменение заднего фона виджета, который открывается после нажатия на кнопку
я написал код, в котором есть два окна.
В первом окне мы можем видеть checkbox и кнопку, которая открывает виджет или же второе окно.
В первом окне при нажатии checkbox фон первого окна меняется на красный.
Надо сделать чтобы фон менялся и во втором окне.
Так-же после закрытия приложения состояние галочки слетает.
Как сделать так, что например в приложении я тыкнул на checkbox и в нём появилась галочка. Но после закрытия приложения ее состояние слетает. Как его сохранить?
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow2(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label_2.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(80, 120, 131, 23))
self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(10, 160, 261, 23))
self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow2"))
self.pushButton_2.setText(_translate("MainWindow", "First window"))
self.pushButton_3.setText(_translate("MainWindow", "Change button color to yellow in mainwindow"))
class ExampleApp2(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self, parent):
super().__init__()
self.setupUi(self)
self.parent = parent
self.pushButton_2.clicked.connect(self.myClose)
self.pushButton_3.clicked.connect(self.colorchange)
def colorchange(self):
self.parent.pushButton.setStyleSheet("background-color: yellow;")
def myClose(self):
self.close()
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(74, 110, 131, 23))
self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(10, 80, 271, 31))
self.checkBox.setObjectName("checkBox")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label.setText("")
self.label.setObjectName("label")
self.label.raise_()
self.pushButton.raise_()
self.checkBox.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Second window"))
self.checkBox.setText(_translate("MainWindow", "Switch this and second window background to red"))
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.clicked)
self.checkBox.stateChanged.connect(self.checkBoxAction)
def checkBoxAction(self, state):
if (QtCore.Qt.Checked == state):
self.label.setStyleSheet("background-color: red;")
else:
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
def clicked(self, item):
self.widget = QtWidgets.QWidget()
self.exampleApp = ExampleApp2(self)
countLayout = self.gridLayout.count()
for it in range(countLayout):
w = self.gridLayout.itemAt(0).widget()
self.gridLayout.removeWidget(w)
w.hide()
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.addWidget(self.exampleApp, 0, 0, 2, 1)
if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Попробуйте так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow2(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label_2.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(80, 120, 131, 23))
self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(10, 160, 261, 23))
self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow2"))
self.pushButton_2.setText(_translate("MainWindow", "First window"))
self.pushButton_3.setText(_translate("MainWindow", "Change button color to yellow in mainwindow"))
class ExampleApp2(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self, parent=None):
super().__init__()
self.setupUi(self)
self.parent = parent
self.pushButton_2.clicked.connect(self.myClose)
self.pushButton_3.clicked.connect(self.colorchange)
def colorchange(self):
self.parent.pushButton.setStyleSheet("background-color: yellow;")
def myClose(self):
# self.close()
self.parent.show() # +++
self.hide() # +++
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(74, 110, 131, 23))
self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(10, 80, 271, 31))
self.checkBox.setObjectName("checkBox")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label.setText("")
self.label.setObjectName("label")
self.label.raise_()
self.pushButton.raise_()
self.checkBox.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Second window"))
self.checkBox.setText(_translate("MainWindow", "Switch this and second window background to red"))
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.onClicked)
self.checkBox.stateChanged.connect(self.checkBoxAction)
self.exampleApp = ExampleApp2(self) # +++
def checkBoxAction(self, state):
if (QtCore.Qt.Checked == state):
self.label.setStyleSheet("background-color: red;")
self.exampleApp.label_2.setStyleSheet("background-color: red;") # +++
else:
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
self.exampleApp.label_2.setStyleSheet("background-color: rgb(74, 255, 195);") # +++
def onClicked(self): # ???, item):
self.exampleApp.show() # +++
self.hide() # +++
''' ???
self.widget = QtWidgets.QWidget()
self.exampleApp = ExampleApp2(self)
countLayout = self.gridLayout.count()
print(countLayout)
for it in range(countLayout):
w = self.gridLayout.itemAt(0).widget()
self.gridLayout.removeWidget(w)
w.hide()
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.addWidget(self.exampleApp, 0, 0, 2, 1)
'''
if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())
Update
я выбрал чтоб фон приложения был красным. Закрыв его и снова открыв галочка с checkbox убирается и фон становиться обратно зеленым. Нужно чтоб все это как-то сохранялось может быть в какой-нибудь .ini файл, но как я не знаю.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow2(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label_2.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(80, 120, 131, 23))
self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(10, 160, 261, 23))
self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow2"))
self.pushButton_2.setText(_translate("MainWindow", "First window"))
self.pushButton_3.setText(_translate("MainWindow", "Change button color to yellow in mainwindow"))
class ExampleApp2(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self, parent=None):
super().__init__()
self.setupUi(self)
self.parent = parent
self.pushButton_2.clicked.connect(self.myClose)
self.pushButton_3.clicked.connect(self.colorchange)
def colorchange(self):
self.parent.pushButton.setStyleSheet("background-color: yellow;")
def myClose(self):
# self.close()
self.parent.show()
self.hide()
def closeEvent(self, event): # +++
self.parent.save() # +++
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(280, 215)
MainWindow.setMinimumSize(QtCore.QSize(280, 215))
MainWindow.setMaximumSize(QtCore.QSize(280, 215))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(74, 110, 131, 23))
self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(10, 80, 271, 31))
self.checkBox.setObjectName("checkBox")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 0, 281, 221))
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
self.label.setText("")
self.label.setObjectName("label")
self.label.raise_()
self.pushButton.raise_()
self.checkBox.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Second window"))
self.checkBox.setText(_translate("MainWindow", "Switch this and second window background to red"))
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.onClicked)
self.checkBox.stateChanged.connect(self.checkBoxAction)
self.exampleApp = ExampleApp2(self)
self.list_settings = [] # +++
self.load_settings() # +++
def checkBoxAction(self, state):
if (QtCore.Qt.Checked == state):
self.label.setStyleSheet("background-color: red;")
self.exampleApp.label_2.setStyleSheet("background-color: red;")
else:
self.label.setStyleSheet("background-color: rgb(74, 255, 195);")
self.exampleApp.label_2.setStyleSheet("background-color: rgb(74, 255, 195);")
def onClicked(self):
self.exampleApp.show()
def closeEvent(self, event): # +++
self.save() # +++
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def save(self):
settings = QSettings(CONFIG_FILE_NAME, QSettings.IniFormat)
settings.setValue('WindowState', self.saveState())
temp_h_l = self.checkBox
self.list_settings.append({"text":temp_h_l.text(),
"isChecked()":temp_h_l.isChecked()})
settings.setValue("Central_widget",self.list_settings.copy())
def load_settings(self):
settings = QSettings(CONFIG_FILE_NAME, QSettings.IniFormat)
cenral = settings.value('Central_widget')
if cenral is None:
return 0
state = settings.value('WindowState')
if state:
self.restoreState(state)
if cenral:
for d in cenral:
self.checkBox.setText(d["text"])
if d["isChecked()"] is True:
self.checkBox.setCheckState(QtCore.Qt.Checked)
CONFIG_FILE_NAME = 'config_checkBox.ini'
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())
