diff options
Diffstat (limited to 'examples/widgets/tutorials/addressbook/part7.py')
-rw-r--r-- | examples/widgets/tutorials/addressbook/part7.py | 522 |
1 files changed, 245 insertions, 277 deletions
diff --git a/examples/widgets/tutorials/addressbook/part7.py b/examples/widgets/tutorials/addressbook/part7.py index f32a2a6a8..3829c003d 100644 --- a/examples/widgets/tutorials/addressbook/part7.py +++ b/examples/widgets/tutorials/addressbook/part7.py @@ -1,48 +1,15 @@ - -############################################################################# -## -## Copyright (C) 2013 Riverbank Computing Limited. -## Copyright (C) 2016 The Qt Company Ltd. -## Contact: http://www.qt.io/licensing/ -## -## This file is part of the Qt for Python examples of the Qt Toolkit. -## -## $QT_BEGIN_LICENSE:BSD$ -## You may use this file under the terms of the BSD license as follows: -## -## "Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions are -## met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * Redistributions in binary form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in -## the documentation and/or other materials provided with the -## distribution. -## * Neither the name of The Qt Company Ltd nor the names of its -## contributors may be used to endorse or promote products derived -## from this software without specific prior written permission. -## -## -## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -## -## $QT_END_LICENSE$ -## -############################################################################# +# Copyright (C) 2013 Riverbank Computing Limited. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import pickle +import sys -from PySide2 import QtCore, QtWidgets +from PySide6.QtCore import QFile, QIODevice, QTextStream, Qt, Slot +from PySide6.QtWidgets import (QApplication, QDialog, QFileDialog, + QGridLayout, QHBoxLayout, QLabel, QLineEdit, + QMessageBox, QPushButton, QTextEdit, + QVBoxLayout, QWidget) class SortedDict(dict): @@ -74,170 +41,175 @@ class SortedDict(dict): iterkeys = __iter__ -class AddressBook(QtWidgets.QWidget): +class AddressBook(QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): - super(AddressBook, self).__init__(parent) + super().__init__(parent) self.contacts = SortedDict() - self.oldName = '' - self.oldAddress = '' - self.currentMode = self.NavigationMode - - nameLabel = QtWidgets.QLabel("Name:") - self.nameLine = QtWidgets.QLineEdit() - self.nameLine.setReadOnly(True) - - addressLabel = QtWidgets.QLabel("Address:") - self.addressText = QtWidgets.QTextEdit() - self.addressText.setReadOnly(True) - - self.addButton = QtWidgets.QPushButton("&Add") - self.editButton = QtWidgets.QPushButton("&Edit") - self.editButton.setEnabled(False) - self.removeButton = QtWidgets.QPushButton("&Remove") - self.removeButton.setEnabled(False) - self.findButton = QtWidgets.QPushButton("&Find") - self.findButton.setEnabled(False) - self.submitButton = QtWidgets.QPushButton("&Submit") - self.submitButton.hide() - self.cancelButton = QtWidgets.QPushButton("&Cancel") - self.cancelButton.hide() - - self.nextButton = QtWidgets.QPushButton("&Next") - self.nextButton.setEnabled(False) - self.previousButton = QtWidgets.QPushButton("&Previous") - self.previousButton.setEnabled(False) - - self.loadButton = QtWidgets.QPushButton("&Load...") - self.loadButton.setToolTip("Load contacts from a file") - self.saveButton = QtWidgets.QPushButton("Sa&ve...") - self.saveButton.setToolTip("Save contacts to a file") - self.saveButton.setEnabled(False) - - self.exportButton = QtWidgets.QPushButton("Ex&port") - self.exportButton.setToolTip("Export as vCard") - self.exportButton.setEnabled(False) + self._old_name = '' + self._old_address = '' + self._current_mode = self.NavigationMode + + name_label = QLabel("Name:") + self._name_line = QLineEdit() + self._name_line.setReadOnly(True) + + address_label = QLabel("Address:") + self._address_text = QTextEdit() + self._address_text.setReadOnly(True) + + self._add_button = QPushButton("&Add") + self._edit_button = QPushButton("&Edit") + self._edit_button.setEnabled(False) + self._remove_button = QPushButton("&Remove") + self._remove_button.setEnabled(False) + self._find_button = QPushButton("&Find") + self._find_button.setEnabled(False) + self._submit_button = QPushButton("&Submit") + self._submit_button.hide() + self._cancel_button = QPushButton("&Cancel") + self._cancel_button.hide() + + self._next_button = QPushButton("&Next") + self._next_button.setEnabled(False) + self._previous_button = QPushButton("&Previous") + self._previous_button.setEnabled(False) + + self._load_button = QPushButton("&Load...") + self._load_button.setToolTip("Load contacts from a file") + self._save_button = QPushButton("Sa&ve...") + self._save_button.setToolTip("Save contacts to a file") + self._save_button.setEnabled(False) + + self._export_button = QPushButton("Ex&port") + self._export_button.setToolTip("Export as vCard") + self._export_button.setEnabled(False) self.dialog = FindDialog() - self.addButton.clicked.connect(self.addContact) - self.submitButton.clicked.connect(self.submitContact) - self.editButton.clicked.connect(self.editContact) - self.removeButton.clicked.connect(self.removeContact) - self.findButton.clicked.connect(self.findContact) - self.cancelButton.clicked.connect(self.cancel) - self.nextButton.clicked.connect(self.next) - self.previousButton.clicked.connect(self.previous) - self.loadButton.clicked.connect(self.loadFromFile) - self.saveButton.clicked.connect(self.saveToFile) - self.exportButton.clicked.connect(self.exportAsVCard) - - buttonLayout1 = QtWidgets.QVBoxLayout() - buttonLayout1.addWidget(self.addButton) - buttonLayout1.addWidget(self.editButton) - buttonLayout1.addWidget(self.removeButton) - buttonLayout1.addWidget(self.findButton) - buttonLayout1.addWidget(self.submitButton) - buttonLayout1.addWidget(self.cancelButton) - buttonLayout1.addWidget(self.loadButton) - buttonLayout1.addWidget(self.saveButton) - buttonLayout1.addWidget(self.exportButton) - buttonLayout1.addStretch() - - buttonLayout2 = QtWidgets.QHBoxLayout() - buttonLayout2.addWidget(self.previousButton) - buttonLayout2.addWidget(self.nextButton) - - mainLayout = QtWidgets.QGridLayout() - mainLayout.addWidget(nameLabel, 0, 0) - mainLayout.addWidget(self.nameLine, 0, 1) - mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop) - mainLayout.addWidget(self.addressText, 1, 1) - mainLayout.addLayout(buttonLayout1, 1, 2) - mainLayout.addLayout(buttonLayout2, 2, 1) - - self.setLayout(mainLayout) + self._add_button.clicked.connect(self.add_contact) + self._submit_button.clicked.connect(self.submit_contact) + self._edit_button.clicked.connect(self.edit_contact) + self._remove_button.clicked.connect(self.remove_contact) + self._find_button.clicked.connect(self.find_contact) + self._cancel_button.clicked.connect(self.cancel) + self._next_button.clicked.connect(self.next) + self._previous_button.clicked.connect(self.previous) + self._load_button.clicked.connect(self.load_from_file) + self._save_button.clicked.connect(self.save_to_file) + self._export_button.clicked.connect(self.export_as_vcard) + + button_layout_1 = QVBoxLayout() + button_layout_1.addWidget(self._add_button) + button_layout_1.addWidget(self._edit_button) + button_layout_1.addWidget(self._remove_button) + button_layout_1.addWidget(self._find_button) + button_layout_1.addWidget(self._submit_button) + button_layout_1.addWidget(self._cancel_button) + button_layout_1.addWidget(self._load_button) + button_layout_1.addWidget(self._save_button) + button_layout_1.addWidget(self._export_button) + button_layout_1.addStretch() + + button_layout_2 = QHBoxLayout() + button_layout_2.addWidget(self._previous_button) + button_layout_2.addWidget(self._next_button) + + main_layout = QGridLayout() + main_layout.addWidget(name_label, 0, 0) + main_layout.addWidget(self._name_line, 0, 1) + main_layout.addWidget(address_label, 1, 0, Qt.AlignTop) + main_layout.addWidget(self._address_text, 1, 1) + main_layout.addLayout(button_layout_1, 1, 2) + main_layout.addLayout(button_layout_2, 2, 1) + + self.setLayout(main_layout) self.setWindowTitle("Simple Address Book") - def addContact(self): - self.oldName = self.nameLine.text() - self.oldAddress = self.addressText.toPlainText() + @Slot() + def add_contact(self): + self._old_name = self._name_line.text() + self._old_address = self._address_text.toPlainText() - self.nameLine.clear() - self.addressText.clear() + self._name_line.clear() + self._address_text.clear() - self.updateInterface(self.AddingMode) + self.update_interface(self.AddingMode) - def editContact(self): - self.oldName = self.nameLine.text() - self.oldAddress = self.addressText.toPlainText() + @Slot() + def edit_contact(self): + self._old_name = self._name_line.text() + self._old_address = self._address_text.toPlainText() - self.updateInterface(self.EditingMode) + self.update_interface(self.EditingMode) - def submitContact(self): - name = self.nameLine.text() - address = self.addressText.toPlainText() + @Slot() + def submit_contact(self): + name = self._name_line.text() + address = self._address_text.toPlainText() if name == "" or address == "": - QtWidgets.QMessageBox.information(self, "Empty Field", - "Please enter a name and address.") + QMessageBox.information(self, "Empty Field", "Please enter a name and address.") return - if self.currentMode == self.AddingMode: + if self._current_mode == self.AddingMode: if name not in self.contacts: self.contacts[name] = address - QtWidgets.QMessageBox.information(self, "Add Successful", - "\"%s\" has been added to your address book." % name) + QMessageBox.information(self, "Add Successful", + f'"{name}" has been added to your address book.') else: - QtWidgets.QMessageBox.information(self, "Add Unsuccessful", - "Sorry, \"%s\" is already in your address book." % name) + QMessageBox.information(self, "Add Unsuccessful", + f'Sorry, "{name}" is already in your address book.') return - elif self.currentMode == self.EditingMode: - if self.oldName != name: + elif self._current_mode == self.EditingMode: + if self._old_name != name: if name not in self.contacts: - QtWidgets.QMessageBox.information(self, "Edit Successful", - "\"%s\" has been edited in your address book." % self.oldName) - del self.contacts[self.oldName] + QMessageBox.information(self, "Edit Successful", + f'"{self.oldName}" has been edited in your ' + 'address book.') + del self.contacts[self._old_name] self.contacts[name] = address else: - QtWidgets.QMessageBox.information(self, "Edit Unsuccessful", - "Sorry, \"%s\" is already in your address book." % name) + QMessageBox.information(self, "Edit Unsuccessful", + f'Sorry, "{name}" is already in your address book.') return - elif self.oldAddress != address: - QtWidgets.QMessageBox.information(self, "Edit Successful", - "\"%s\" has been edited in your address book." % name) + elif self._old_address != address: + QMessageBox.information(self, "Edit Successful", + f'"{name}" has been edited in your address book.') self.contacts[name] = address - self.updateInterface(self.NavigationMode) + self.update_interface(self.NavigationMode) + @Slot() def cancel(self): - self.nameLine.setText(self.oldName) - self.addressText.setText(self.oldAddress) - self.updateInterface(self.NavigationMode) + self._name_line.setText(self._old_name) + self._address_text.setText(self._old_address) + self.update_interface(self.NavigationMode) - def removeContact(self): - name = self.nameLine.text() - address = self.addressText.toPlainText() + @Slot() + def remove_contact(self): + name = self._name_line.text() if name in self.contacts: - button = QtWidgets.QMessageBox.question(self, "Confirm Remove", - "Are you sure you want to remove \"%s\"?" % name, - QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + button = QMessageBox.question(self, "Confirm Remove", + f'Are you sure you want to remove "{name}"?', + QMessageBox.Yes | QMessageBox.No) - if button == QtWidgets.QMessageBox.Yes: + if button == QMessageBox.Yes: self.previous() del self.contacts[name] - QtWidgets.QMessageBox.information(self, "Remove Successful", - "\"%s\" has been removed from your address book." % name) + QMessageBox.information(self, "Remove Successful", + f'"{name}" has been removed from your address book.') - self.updateInterface(self.NavigationMode) + self.update_interface(self.NavigationMode) + @Slot() def next(self): - name = self.nameLine.text() + name = self._name_line.text() it = iter(self.contacts) try: @@ -250,11 +222,12 @@ class AddressBook(QtWidgets.QWidget): except StopIteration: next_name, next_address = iter(self.contacts).next() - self.nameLine.setText(next_name) - self.addressText.setText(next_address) + self._name_line.setText(next_name) + self._address_text.setText(next_address) + @Slot() def previous(self): - name = self.nameLine.text() + name = self._name_line.text() prev_name = prev_address = None for this_name, this_address in self.contacts: @@ -264,83 +237,83 @@ class AddressBook(QtWidgets.QWidget): prev_name = this_name prev_address = this_address else: - self.nameLine.clear() - self.addressText.clear() + self._name_line.clear() + self._address_text.clear() return if prev_name is None: for prev_name, prev_address in self.contacts: pass - self.nameLine.setText(prev_name) - self.addressText.setText(prev_address) + self._name_line.setText(prev_name) + self._address_text.setText(prev_address) - def findContact(self): + def find_contact(self): self.dialog.show() - if self.dialog.exec_() == QtWidgets.QDialog.Accepted: - contactName = self.dialog.getFindText() + if self.dialog.exec() == QDialog.Accepted: + contact_name = self.dialog.get_find_text() - if contactName in self.contacts: - self.nameLine.setText(contactName) - self.addressText.setText(self.contacts[contactName]) + if contact_name in self.contacts: + self._name_line.setText(contact_name) + self._address_text.setText(self.contacts[contact_name]) else: - QtWidgets.QMessageBox.information(self, "Contact Not Found", - "Sorry, \"%s\" is not in your address book." % contactName) + QMessageBox.information(self, "Contact Not Found", + f'Sorry, "{contact_name}" is not in your address book.') return - self.updateInterface(self.NavigationMode) + self.update_interface(self.NavigationMode) - def updateInterface(self, mode): - self.currentMode = mode + def update_interface(self, mode): + self._current_mode = mode - if self.currentMode in (self.AddingMode, self.EditingMode): - self.nameLine.setReadOnly(False) - self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) - self.addressText.setReadOnly(False) + if self._current_mode in (self.AddingMode, self.EditingMode): + self._name_line.setReadOnly(False) + self._name_line.setFocus(Qt.OtherFocusReason) + self._address_text.setReadOnly(False) - self.addButton.setEnabled(False) - self.editButton.setEnabled(False) - self.removeButton.setEnabled(False) + self._add_button.setEnabled(False) + self._edit_button.setEnabled(False) + self._remove_button.setEnabled(False) - self.nextButton.setEnabled(False) - self.previousButton.setEnabled(False) + self._next_button.setEnabled(False) + self._previous_button.setEnabled(False) - self.submitButton.show() - self.cancelButton.show() + self._submit_button.show() + self._cancel_button.show() - self.loadButton.setEnabled(False) - self.saveButton.setEnabled(False) - self.exportButton.setEnabled(False) + self._load_button.setEnabled(False) + self._save_button.setEnabled(False) + self._export_button.setEnabled(False) - elif self.currentMode == self.NavigationMode: + elif self._current_mode == self.NavigationMode: if not self.contacts: - self.nameLine.clear() - self.addressText.clear() + self._name_line.clear() + self._address_text.clear() - self.nameLine.setReadOnly(True) - self.addressText.setReadOnly(True) - self.addButton.setEnabled(True) + self._name_line.setReadOnly(True) + self._address_text.setReadOnly(True) + self._add_button.setEnabled(True) number = len(self.contacts) - self.editButton.setEnabled(number >= 1) - self.removeButton.setEnabled(number >= 1) - self.findButton.setEnabled(number > 2) - self.nextButton.setEnabled(number > 1) - self.previousButton.setEnabled(number >1 ) + self._edit_button.setEnabled(number >= 1) + self._remove_button.setEnabled(number >= 1) + self._find_button.setEnabled(number > 2) + self._next_button.setEnabled(number > 1) + self._previous_button.setEnabled(number > 1) - self.submitButton.hide() - self.cancelButton.hide() + self._submit_button.hide() + self._cancel_button.hide() - self.exportButton.setEnabled(number >= 1) + self._export_button.setEnabled(number >= 1) - self.loadButton.setEnabled(True) - self.saveButton.setEnabled(number >= 1) + self._load_button.setEnabled(True) + self._save_button.setEnabled(number >= 1) - def saveToFile(self): - fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self, - "Save Address Book", '', - "Address Book (*.abk);;All Files (*)") + def save_to_file(self): + fileName, _ = QFileDialog.getSaveFileName(self, + "Save Address Book", '', + "Address Book (*.abk);;All Files (*)") if not fileName: return @@ -348,17 +321,17 @@ class AddressBook(QtWidgets.QWidget): try: out_file = open(str(fileName), 'wb') except IOError: - QtWidgets.QMessageBox.information(self, "Unable to open file", - "There was an error opening \"%s\"" % fileName) + QMessageBox.information(self, "Unable to open file", + f'There was an error opening "{fileName}"') return pickle.dump(self.contacts, out_file) out_file.close() - def loadFromFile(self): - fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self, - "Open Address Book", '', - "Address Book (*.abk);;All Files (*)") + def load_from_file(self): + fileName, _ = QFileDialog.getOpenFileName(self, + "Open Address Book", '', + "Address Book (*.abk);;All Files (*)") if not fileName: return @@ -366,56 +339,54 @@ class AddressBook(QtWidgets.QWidget): try: in_file = open(str(fileName), 'rb') except IOError: - QtWidgets.QMessageBox.information(self, "Unable to open file", - "There was an error opening \"%s\"" % fileName) + QMessageBox.information(self, "Unable to open file", + f'There was an error opening "{fileName}"') return self.contacts = pickle.load(in_file) in_file.close() if len(self.contacts) == 0: - QtWidgets.QMessageBox.information(self, "No contacts in file", - "The file you are attempting to open contains no " - "contacts.") + QMessageBox.information(self, "No contacts in file", + "The file you are attempting to open contains no contacts.") else: for name, address in self.contacts: - self.nameLine.setText(name) - self.addressText.setText(address) + self._name_line.setText(name) + self._address_text.setText(address) - self.updateInterface(self.NavigationMode) + self.update_interface(self.NavigationMode) - def exportAsVCard(self): - name = str(self.nameLine.text()) - address = self.addressText.toPlainText() + def export_as_vcard(self): + name = str(self._name_line.text()) + address = self._address_text.toPlainText() - nameList = name.split() + name_list = name.split() - if len(nameList) > 1: - firstName = nameList[0] - lastName = nameList[-1] + if len(name_list) > 1: + first_name = name_list[0] + last_name = name_list[-1] else: - firstName = name - lastName = '' + first_name = name + last_name = '' - fileName = QtWidgets.QFileDialog.getSaveFileName(self, "Export Contact", - '', "vCard Files (*.vcf);;All Files (*)")[0] + file_name = QFileDialog.getSaveFileName(self, "Export Contact", + '', "vCard Files (*.vcf);;All Files (*)")[0] - if not fileName: + if not file_name: return - out_file = QtCore.QFile(fileName) + out_file = QFile(file_name) - if not out_file.open(QtCore.QIODevice.WriteOnly): - QtWidgets.QMessageBox.information(self, "Unable to open file", - out_file.errorString()) + if not out_file.open(QIODevice.WriteOnly): + QMessageBox.information(self, "Unable to open file", out_file.errorString()) return - out_s = QtCore.QTextStream(out_file) + out_s = QTextStream(out_file) out_s << 'BEGIN:VCARD' << '\n' out_s << 'VERSION:2.1' << '\n' - out_s << 'N:' << lastName << ';' << firstName << '\n' - out_s << 'FN:' << ' '.join(nameList) << '\n' + out_s << 'N:' << last_name << ';' << first_name << '\n' + out_s << 'FN:' << ' '.join(name_list) << '\n' address.replace(';', '\\;') address.replace('\n', ';') @@ -424,53 +395,50 @@ class AddressBook(QtWidgets.QWidget): out_s << 'ADR;HOME:;' << address << '\n' out_s << 'END:VCARD' << '\n' - QtWidgets.QMessageBox.information(self, "Export Successful", - "\"%s\" has been exported as a vCard." % name) + QMessageBox.information(self, "Export Successful", + f'"{name}" has been exported as a vCard.') -class FindDialog(QtWidgets.QDialog): +class FindDialog(QDialog): def __init__(self, parent=None): - super(FindDialog, self).__init__(parent) + super().__init__(parent) - findLabel = QtWidgets.QLabel("Enter the name of a contact:") - self.lineEdit = QtWidgets.QLineEdit() + find_label = QLabel("Enter the name of a contact:") + self._line_edit = QLineEdit() - self.findButton = QtWidgets.QPushButton("&Find") - self.findText = '' + self._find_button = QPushButton("&Find") + self._find_text = '' - layout = QtWidgets.QHBoxLayout() - layout.addWidget(findLabel) - layout.addWidget(self.lineEdit) - layout.addWidget(self.findButton) + layout = QHBoxLayout() + layout.addWidget(find_label) + layout.addWidget(self._line_edit) + layout.addWidget(self._find_button) self.setLayout(layout) self.setWindowTitle("Find a Contact") - self.findButton.clicked.connect(self.findClicked) - self.findButton.clicked.connect(self.accept) + self._find_button.clicked.connect(self.find_clicked) + self._find_button.clicked.connect(self.accept) - def findClicked(self): - text = self.lineEdit.text() + def find_clicked(self): + text = self._line_edit.text() if not text: - QtWidgets.QMessageBox.information(self, "Empty Field", - "Please enter a name.") + QMessageBox.information(self, "Empty Field", "Please enter a name.") return - self.findText = text - self.lineEdit.clear() + self._find_text = text + self._line_edit.clear() self.hide() - def getFindText(self): - return self.findText + def get_find_text(self): + return self._find_text if __name__ == '__main__': - import sys - - app = QtWidgets.QApplication(sys.argv) + app = QApplication(sys.argv) - addressBook = AddressBook() - addressBook.show() + address_book = AddressBook() + address_book.show() - sys.exit(app.exec_()) + sys.exit(app.exec()) |