Попытка отправить сигнал между двумя классами с помощью PyQt5 для изменения метки из configparser - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь использовать сигналы и слоты для обновления элемента в моей программе.Первая страница открывается и читает файл конфигурации, чтобы установить некоторые метки.У меня есть страница «Опции», где вы можете обновить файл конфигурации.То, что я хочу сделать, это когда вы нажимаете «сохранить» во втором окне, оно сохраняется в конфигурации, а затем на первой странице запускается функция (read_Config), которая затем читает обновленный файл конфигурации и обновляет метку для изменения.Я пробовал несколько разных методов и не понимаю, как работают сигналы и слоты.Спасибо за вашу помощь.Вот код, это два файла.test.py и config.ini.

Это test.py:

#!/bin/usr/env python

import sys
import configparser
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication

class TestApp(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super(TestApp, self).__init__()
        self.setupUi(self)
        self.dialogs = []
        self.read_Config()

        self.window2Button.clicked.connect(self.goto_Pagetwo)
        self.closeButton.clicked.connect(self.close)

    def read_Config(self):
        config = configparser.ConfigParser()
        config.read('config.ini')
        labelone = config['default']['labelone']
        self.label.setText(labelone)

    def goto_Pagetwo(self):
        dialog = Pagetwo(self)
        self.dialogs.append(dialog)
        dialog.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(244, 113)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.window2Button = QtWidgets.QPushButton(self.centralwidget)
        self.window2Button.setObjectName("window2Button")
        self.verticalLayout.addWidget(self.window2Button)
        self.closeButton = QtWidgets.QPushButton(self.centralwidget)
        self.closeButton.setObjectName("closeButton")
        self.verticalLayout.addWidget(self.closeButton)
        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.label.setText(_translate("MainWindow", "This is a Label"))
        self.window2Button.setText(_translate("MainWindow", "Window 2"))
        self.closeButton.setText(_translate("MainWindow", "Close"))


class Pagetwo(QtWidgets.QMainWindow):

    trigger = pyqtSignal()

    def __init__(self, parent):
        super(Pagetwo, self).__init__()
        self.setupUi(self)
        self.dialogs = []

        self.saveButton.clicked.connect(self.save)
        self.closeButton.clicked.connect(self.close)

    def save(self):
        string = self.lineEdit.text()
        config = configparser.ConfigParser()
        config.read('config.ini')
        config.set('default', 'labelone', string)
        with open('config.ini', 'w') as configfile:
            config.write(configfile)
        self.trigger.connect(self.parent().read_Config())
        self.trigger.emit()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(246, 128)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.verticalLayout.addWidget(self.lineEdit)
        self.saveButton = QtWidgets.QPushButton(self.centralwidget)
        self.saveButton.setObjectName("saveButton")
        self.verticalLayout.addWidget(self.saveButton)
        self.closeButton = QtWidgets.QPushButton(self.centralwidget)
        self.closeButton.setObjectName("closeButton")
        self.verticalLayout.addWidget(self.closeButton)
        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.saveButton.setText(_translate("MainWindow", "Save"))
        self.closeButton.setText(_translate("MainWindow", "Close"))

def main():
    app = QApplication(sys.argv)
    main = TestApp()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

А это файл config.ini:

[default]
labelone = This is a label

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

1 Ответ

0 голосов
/ 06 декабря 2018

У вас есть следующие ошибки:

  • Конструктор Pagetwo не использует родительский параметр, поэтому parent() будет None:

    class Pagetwo(QtWidgets.QMainWindow):
        trigger = pyqtSignal()
    
        def __init__(self, parent): # <-----
            super(Pagetwo, self).__init__() # <---- You have to pass
    
        # ...
    
  • Рекомендуется устанавливать соединение только один раз, потому что соединение не распознает, если соединение уже было, например, если вы нажмете n раз кнопку сохранения Pagetwo, тогда будет n соединений, поэтому он будет вызывать то же самоеслот n раз, в этом случае лучше сделать это в конструкторе.

  • При подключении используется имя функции, то есть не следует вызыватьэто с ().

Учитывая вышеизложенное, решение:

class Pagetwo(QtWidgets.QMainWindow):
    trigger = pyqtSignal()

    def __init__(self, parent=None):
        super(Pagetwo, self).__init__(parent) # <---
        self.setupUi(self)
        self.dialogs = []

        self.saveButton.clicked.connect(self.save)
        self.closeButton.clicked.connect(self.close)
        self.trigger.connect(self.parent().read_Config)  # <---

    def save(self):
        string = self.lineEdit.text()
        config = configparser.ConfigParser()
        config.read('config.ini')
        config.set('default', 'labelone', string)
        with open('config.ini', 'w') as configfile:
            config.write(configfile)
        self.trigger.emit()

    # ...
...