Кнопка PyQt5 во втором окне не работает - PullRequest
0 голосов
/ 07 октября 2018

Я пишу зашифрованную программу на Python с использованием PyQt5, которая также имеет функцию электронной почты.В программе есть 2 окна, и цель второго окна - добавить новый контакт в файл json.Когда я нажимаю кнопку во втором окне, программа не регистрирует щелчок.

В качестве второго вопроса у меня также возникают проблемы с переносом новой контактной информации в нужное место в файле.

Вот код моего второго окна:

class AddContactWindow(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()
        self.setStyleSheet(Window.StyleSheet1)

    def init_ui(self):

        self.TitleLab = QtWidgets.QLabel('Add New Contact')
        self.NameLab = QtWidgets.QLabel('Name: ')
        self.NameLe = QtWidgets.QLineEdit(self)
        self.CodeNameLab = QtWidgets.QLabel('Code Name: ')
        self.CodeNameLe = QtWidgets.QLineEdit(self)
        self.EmailLab = QtWidgets.QLabel('Email address: ')
        self.EmailLe = QtWidgets.QLineEdit(self)
        self.KeyLab = QtWidgets.QLabel('Key: ')
        self.KeyLe = QtWidgets.QLineEdit(self)
        self.SubmitBtn = QtWidgets.QPushButton('Add Contact')

        h_box = QtWidgets.QHBoxLayout()
        h_box.addStretch()
        h_box.addWidget(self.TitleLab)
        h_box.addStretch()

        h_box1 = QtWidgets.QHBoxLayout()
        h_box1.addWidget(self.NameLab)
        h_box1.addWidget(self.NameLe)

        h_box2 = QtWidgets.QHBoxLayout()
        h_box2.addWidget(self.CodeNameLab)
        h_box2.addWidget(self.CodeNameLe)

        h_box3 = QtWidgets.QHBoxLayout()
        h_box3.addWidget(self.EmailLab)
        h_box3.addWidget(self.EmailLe)

        h_box4 = QtWidgets.QHBoxLayout()
        h_box4.addWidget(self.KeyLab)
        h_box4.addWidget(self.KeyLe)

        h_box5 = QtWidgets.QHBoxLayout()
        h_box5.addStretch()
        h_box5.addWidget(self.SubmitBtn)
        h_box5.addStretch()

        v_box = QtWidgets.QVBoxLayout()
        v_box.addLayout(h_box)
        v_box.addLayout(h_box1)
        v_box.addLayout(h_box2)
        v_box.addLayout(h_box3)
        v_box.addLayout(h_box4)
        v_box.addLayout(h_box5)

        self.setLayout(v_box)
        self.setWindowTitle('Creat New Contact')

        self.SubmitBtn.clicked.connect(self.submitBtn_click)
        #self.SubmitBtn.clicked.connect(self.test)

        self.show()

    def test(self):
        self.close()

    def submitBtn_click(self):
        print('Processing')
        data = {}
        data['Name'] = "New Contact Name"
        data['CodeName'] = "New Code Name"
        data['Email'] = "New Email Address"
        data['Key'] = "TestKey"
        with open('Contacts.json', 'a') as fp:
            fp.seek(0, os.SEEK_END)              # seek to end of file; f.seek(0, 2) is legal
            fp.seek(fp.tell() -5, os.SEEK_SET)   # go backwards 5 bytes
            fp.write(", \n")
            json.dump(data, fp, sort_keys=True, indent=4, separators=(',', ': '))
            fp.close()  
        Window().__init__()
        self.close()

Вот все мои файлы:

Полный код файла Python

Contacts.json

Таблица стилей CSS

keyTestKey.txt

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Ваш код имеет несколько проблем:

  • Следующий код: Window() .__init__() не имеет смысла, вы создаете новый объект и сбрасываете тот же самый объект, который вы только чтосоздано, я подозреваю, что вы думаете, что с этим вы перезагружаете начальное окно, но.

  • С другой стороны, в submitBtn_click вы перезаписываете данные только с одним контактом, теряяИсходный формат, что вам нужно сделать, это прочитать JSON, изменить его и сохранить.

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

  • Еще одна проблема, которую я вижу, заключается в том, что вы не используете макеты правильно.

Учитывая предыдущую вещь и другие, которые не настолько трансцендентны (я не использовал keyCode, так как у меня нет .txt, я думаю, что вы можете его реализовать)

import json
from PyQt5 import QtWidgets, QtGui, QtCore


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.contact_window = AddContactWindow()
        self.contact_window.SubmitBtn.clicked.connect(self.loadContacts)
        self.contact_window.SubmitBtn.clicked.connect(self.show)

    def init_ui(self):
        lay = QtWidgets.QVBoxLayout(self)

        self.ContactLab = QtWidgets.QLabel('Contact')
        self.ContactDropDown = QtWidgets.QComboBox(self)
        self.ContactDropDown.addItem('Please select a contact')

        lay.addWidget(self.ContactLab)
        lay.addWidget(self.ContactDropDown)
        lay.addStretch()
        self.ContactsFile = []
        self.loadContacts()

    @QtCore.pyqtSlot()
    def loadContacts(self):
        with open('Contacts.json') as f:
            self.ContactsFile = json.load(f)
            self.ContactDropDown.clear()
            for contact in self.ContactsFile['contacts']:
                self.ContactDropDown.addItem(contact['Name'] + "/" + contact['CodeName'])
            self.ContactDropDown.addItem("Add new contact")

            self.setWindowTitle('Cipher Program')
            self.ContactDropDown.activated[str].connect(self.contactBtn_clk)
            self.show()

    def contactBtn_clk(self, text):
        for contact in self.ContactsFile['contacts']:
            if text == contact['Name'] + "/" + contact['CodeName']: 
                email = contact['Email']
                contactName = text
                # keyCode = open(r'KEYS\key' + contact['Key'] + '.txt', 'r').read()
                # key = bytes(self.KeyCode, 'utf-8')
            elif text == "Add new contact":
                self.contact_window.clear()
                self.contact_window.show()
                self.close()


class AddContactWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
        # self.setStyleSheet(Window.StyleSheet1)

    def init_ui(self):
        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(QtWidgets.QLabel('Add New Contact'))
        flay = QtWidgets.QFormLayout()
        lay.addLayout(flay)
        lay.addStretch()

        self.NameLe = QtWidgets.QLineEdit()
        self.CodeNameLe = QtWidgets.QLineEdit()
        self.EmailLe = QtWidgets.QLineEdit(self)
        self.KeyLe = QtWidgets.QLineEdit(self)
        self.SubmitBtn = QtWidgets.QPushButton('Add Contact')
        self.SubmitBtn.clicked.connect(self.submitBtn_click)

        flay.addRow("Name: ", self.NameLe)
        flay.addRow("Code Name: ", self.CodeNameLe)
        flay.addRow("Email address: ", self.EmailLe)
        flay.addRow("Key: ", self.KeyLe)
        flay.addRow(self.SubmitBtn)

        self.setWindowTitle('Creat New Contact')

    def showEvent(self, event):
        if self.isVisible():
            self.NameLe.setFocus()
        super(AddContactWindow, self).showEvent(event)

    def clear(self):
        self.NameLe.clear()
        self.CodeNameLe.clear()
        self.EmailLe.clear()
        self.KeyLe.clear()

    @QtCore.pyqtSlot()
    def submitBtn_click(self):
        contact = dict()
        contact['Name'] = self.NameLe.text()
        contact['CodeName'] = self.CodeNameLe.text()
        contact['Email'] = self.EmailLe.text()
        contact['Key'] = self.KeyLe.text()
        with open('Contacts.json', 'r+') as fp:
            data = json.load(fp)
            data["contacts"].append(contact)
            fp.seek(0)
            json.dump(data, fp, indent=4)
            fp.truncate()
        self.close()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    with open('PyQt5 StyleSheet1 (Red, Black, and Blue).css', 'r') as styleSheet:
        qss = styleSheet.read()
        app.setStyleSheet(qss)
    a_window = Window()
    sys.exit(app.exec_())
0 голосов
/ 07 октября 2018

Измените код между строками 218 и 219 на:

self.hide()
AddContactWindow().exec_()
self.show()

self.ContactDropDown.clear()
self.ContactDropDown.addItem('Please select a contact')
with open('Contacts.json') as f:
    self.ContactsFile = json.load(f)
for contact in self.ContactsFile['contacts']:
    print(contact)
    self.ContactDropDown.addItem(contact['Name'] + "/" + contact['CodeName'])
self.ContactDropDown.addItem("Add new contact")

Измените код в строке 297 следующим образом:

class AddContactWindow(QtWidgets.QDialog):

Измените код между строками 368 и 375 на:

ContactsFile = []
with open('Contacts.json', 'r') as fp:
    ContactsFile = json.load(fp)
    fp.close()
ContactsFile["contacts"].append(data)
with open('Contacts.json', 'w') as fp:
    json.dump(ContactsFile, fp, sort_keys=True, indent=4, separators=(',', ': '))
    fp.close()

Полный код файла Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...