Ваш код имеет несколько проблем:
Следующий код: 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_())