Jak napisać prosty edytor tekstu w PYQT5

Jak napisać prosty edytor tekstu w PYQT5
W tym artykule obejmie przewodnik o utworzeniu prostego edytora tekstu w Python3 i PYQT5. QT5 to zestaw bibliotek międzyplatformowych napisanych w C ++, używany głównie do tworzenia bogatych aplikacji graficznych. PYQT5 zapewnia powiązania Pythona dla najnowszej wersji QT5. Wszystkie próbki kodu w tym artykule są testowane z Python 3.8.2 i PYQT5 Wersja 5.14.1 na Ubuntu 20.04.

Instalowanie PYQT5 w Linux

Aby zainstalować PYQT5 w najnowszej wersji Ubuntu, uruchom poniższe polecenie:

$ sudo apt instal Python3-pyqt5

Jeśli używasz dowolnej innej dystrybucji Linux, wyszukaj termin „PYQT5” w menedżerze pakietów i zainstaluj go stamtąd. Alternatywnie możesz zainstalować PYQT5 z menedżera pakietów PIP za pomocą poniższego polecenia:

$ pip instaluj pyqt5

Zauważ, że w niektórych dystrybucjach może być konieczne użycie polecenia PIP3, aby poprawnie zainstalować PYQT5.

Pełny kod

Wcześniej publikuję pełny kod, aby lepiej zrozumieć kontekst dla poszczególnych fragmentów kodu wyjaśnionych później w artykule. Jeśli znasz Python i PYQT5, możesz po prostu zapoznać się z kodem poniżej i pominąć wyjaśnienie.

#!/usr/bin/env python3
Import Sys
z pyqt5.Qtwidgets import qWidget, qapplication, qvboxlayout, qhboxlayout
z pyqt5.Qtwidgets import qtextedit, qlabel, qshortcut, qfilediaLog, qmessageBox
z pyqt5.QTGUI Import Qkey SEASESPENCE
z PYQT5 Import QT
okno klasy (qWidget):
def __init __ (ja):
Super().__w tym__()
samego siebie.file_path = brak
samego siebie.Open_New_file_Shortcut = qshortcut (QKeySeSeence ('ctrl+o'), self)
samego siebie.Open_New_file_Shortcut.aktywowany.Połącz (ja.Open_New_file)
samego siebie.SAVE_CURRENT_FILE_SHORTCUT = QSHORTCUT (QKEYSESESENCE ('CTRL+S'), Self)
samego siebie.SAVE_CURRENT_FILE_SHORTCUT.aktywowany.Połącz (ja.save_current_file)
vbox = qvboxlayout ()
text = "plik bez tytułu"
samego siebie.title = qlabel (tekst)
samego siebie.tytuł.setwordwrap (prawda)
samego siebie.tytuł.SetaInignment (Qt.Qt.Wyrównany)
vbox.AddWidget (ja.tytuł)
samego siebie.setLayout (vbox)
samego siebie.scrolleble_text_area = qtextedit ()
vbox.AddWidget (ja.Scrolleble_text_area)
def open_new_file (self):
samego siebie.File_Path, Filter_Type = qfilediaLog.getOpenFileName (self, „Otwórz nowy plik”,
"", "Wszystkie pliki (*)")
Jeśli ja.ścieżka pliku:
z otwartym (jaźń.FILE_PATH, „R”) jako f:
file_contents = f.Czytać()
samego siebie.tytuł.setText (self.ścieżka pliku)
samego siebie.Scrolleble_text_area.setText (file_contents)
w przeciwnym razie:
samego siebie.invalid_path_alert_message ()
def save_current_file (self):
jeśli nie siebie.ścieżka pliku:
new_file_path, filtr_type = qfilediaLog.getSaveFileName (self, „Zapisz ten plik
jako… "," ",„ Wszystkie pliki (*) ")
Jeśli new_file_path:
samego siebie.file_path = new_file_path
w przeciwnym razie:
samego siebie.invalid_path_alert_message ()
zwróć false
file_contents = self.Scrolleble_text_area.toplaintext ()
z otwartym (jaźń.file_path, „w”) jako f:
F.Write (File_Contents)
samego siebie.tytuł.setText (self.ścieżka pliku)
def Closevent (self, wydarzenie):
MessageBox = qMessageBox ()
title = "Wyrzuć aplikację?"
message = "Ostrzeżenie !!\ n \ niff you rezygnujesz bez zapisywania, wszelkie zmiany dokonane w pliku
będzie zgubiony.\ n \ nsave plik przed paleniem?"
Odpowiedz = MessageBox.Pytanie (ja, tytuł, wiadomość, MessageBox.Tak | skrzynka pocztowa.Nie |
skrzynka pocztowa.Anuluj, MessageBox.Anulować)
Jeśli odpowiedź == MessageBox.Tak:
return_value = self.save_current_file ()
Jeśli return_value == false:
wydarzenie.ignorować()
elif odpowiedź == Messagebox.NIE:
wydarzenie.zaakceptować()
w przeciwnym razie:
wydarzenie.ignorować()
def invalid_path_alert_message (self):
MessageBox = qMessageBox ()
skrzynka pocztowa.setWindowTitle („nieprawidłowy plik”)
skrzynka pocztowa.setText („Wybrana nazwa pliku lub ścieżka jest nieprawidłowa. Wybierz
Ważny plik.")
skrzynka pocztowa.exec ()
Jeśli __name__ == '__main__':
app = qapplication (sys.Argv)
w = okno ()
w.showmaximized ()
Sys.wyjście (aplikacja.exec_ ())

Wyjaśnienie

Pierwsza część kodu po prostu importuje moduły, które będą używane w całej próbce:

Import Sys
z pyqt5.Qtwidgets import qWidget, qapplication, qvboxlayout, qhboxlayout
z pyqt5.Qtwidgets import qtextedit, qlabel, qshortcut, qfilediaLog, qmessageBox
z pyqt5.QTGUI Import Qkey SEASESPENCE
z PYQT5 Import QT

W następnej części powstaje nowa klasa o nazwie „Window”, która dziedzicza po klasie „QWidget”. Klasa QWidget zapewnia powszechnie używane komponenty graficzne w QT. Korzystając z „super”, możesz upewnić się, że obiekt nadrzędny jest zwracany.

okno klasy (qWidget):
def __init __ (ja):
Super().__w tym__()

Niektóre zmienne są zdefiniowane w następnej części. Ścieżka pliku jest domyślnie ustawiona na „Brak”, a skróty do otwarcia pliku używającego i zapisywania pliku używające są zdefiniowane za pomocą klasy QShortcut. Te skróty są następnie podłączone do ich odpowiednich metod, które są wywoływane za każdym razem, gdy użytkownik naciska zdefiniowane kombinacje klawiszy.

samego siebie.file_path = brak
samego siebie.Open_New_file_Shortcut = qshortcut (QKeySeSeence ('ctrl+o'), self)
samego siebie.Open_New_file_Shortcut.aktywowany.Połącz (ja.Open_New_file)
samego siebie.SAVE_CURRENT_FILE_SHORTCUT = QSHORTCUT (QKEYSESESENCE ('CTRL+S'), Self)
samego siebie.SAVE_CURRENT_FILE_SHORTCUT.aktywowany.Połącz (ja.save_current_file)

Korzystając z klasy QVBoxLayout, powstaje nowy układ, do którego zostaną dodane widżety dziecięce. Etykieta wyrównana o środku jest ustawiona dla domyślnej nazwy pliku za pomocą klasy QLabel.

vbox = qvboxlayout ()
text = "plik bez tytułu"
samego siebie.title = qlabel (tekst)
samego siebie.tytuł.setwordwrap (prawda)
samego siebie.tytuł.SetaInignment (Qt.Qt.Wyrównany)
vbox.AddWidget (ja.tytuł)
samego siebie.setLayout (vbox)

Następnie do układu dodaje się obszar tekstu za pomocą obiektu QTextEdit. Widżet QTextedit da ci edytowalny, przewijany obszar do pracy. Ten widżet obsługuje typową kopię, wklej, cięcie, cofanie, ponowne, wybierane i itp. Skróty klawiszowe. Możesz także użyć menu kontekstowego kliknięcia prawym przyciskiem myszy w obszarze tekstu.

samego siebie.scrolleble_text_area = qtextedit ()
vbox.AddWidget (ja.Scrolleble_text_area)

Metoda „Open_New_fie” jest wywoływana, gdy użytkownik ukończy skrót klawiatury. Klasa QFileDiaLog przedstawia użytkownikowi dialog Plik Picker. Ścieżka pliku jest określana po tym, jak użytkownik wybierze plik od pickera. Jeśli ścieżka pliku jest poprawna, zawartość tekstu jest odczytywana z pliku i ustawiona na widżet QTextedit. To sprawia, że ​​tekst jest widoczny dla użytkownika, zmienia tytuł nowej nazwy pliku i uzupełnia proces otwierania nowego pliku. Jeśli z jakiegoś powodu nie można ustalić ścieżki pliku, użytkownikowi pokazano pola alarmowego „nieprawidłowego pliku”.

def open_new_file (self):
samego siebie.File_Path, Filter_Type = qfilediaLog.getOpenFileName (self, „Otwórz nowy plik”, „”,
"Wszystkie pliki (*)")
Jeśli ja.ścieżka pliku:
z otwartym (jaźń.FILE_PATH, „R”) jako f:
file_contents = f.Czytać()
samego siebie.tytuł.setText (self.ścieżka pliku)
samego siebie.Scrolleble_text_area.setText (file_contents)
w przeciwnym razie:
samego siebie.invalid_path_alert_message ()

Metoda „save_current_file” jest wywoływana za każdym razem, gdy użytkownik uzupełnia skrót klawiatury. Zamiast odzyskać nową ścieżkę pliku, QFileDiaLog prosi teraz użytkownika o podanie ścieżki. Jeśli ścieżka pliku jest prawidłowa, zawartość widoczna w widżecie QTextedit jest zapisywana na pełnej ścieżce pliku, w przeciwnym razie pokazano pole alertu „nieprawidłowe plik”. Tytuł aktualnie edytowanego pliku jest również zmieniany na nową lokalizację dostarczoną przez użytkownika.

def save_current_file (self):
jeśli nie siebie.ścieżka pliku:
new_file_path, filtr_type = qfilediaLog.getSaveFileName (self, „Zapisz ten plik
jako… "," ",„ Wszystkie pliki (*) ")
Jeśli new_file_path:
samego siebie.file_path = new_file_path
w przeciwnym razie:
samego siebie.invalid_path_alert_message ()
zwróć false
file_contents = self.Scrolleble_text_area.toplaintext ()
z otwartym (jaźń.file_path, „w”) jako f:
F.Write (File_Contents)
samego siebie.tytuł.setText (self.ścieżka pliku)

Metoda „Closevent” jest częścią API obsługi zdarzeń PYQT5. Ta metoda jest wywoływana ilekroć użytkownik próbuje zamknąć okno za pomocą przycisku krzyżowego lub poprzez naciśnięcie kombinacji klawiszy. Po zwolnieniu zdarzenia bliskiego użytkownika pokazano okno dialogowe z trzema opcjami: „Tak”, „nie” i „Anuluj”. Przycisk „Tak” zapisuje plik i zamyka aplikację, a przycisk „Nie” zamyka plik bez zapisywania zawartości. Przycisk „Anuluj” zamyka okno dialogowe i zabiera użytkownika z powrotem do aplikacji.

def Closevent (self, wydarzenie):
MessageBox = qMessageBox ()
title = "Wyrzuć aplikację?"
message = "Ostrzeżenie !!\ n \ niff You Resit Bez zapisywania, wszelkie zmiany wprowadzone w pliku będą
być zgubionym.\ n \ nsave plik przed paleniem?"
Odpowiedz = MessageBox.Pytanie (ja, tytuł, wiadomość, MessageBox.Tak | skrzynka pocztowa.Nie |
skrzynka pocztowa.Anuluj, MessageBox.Anulować)
Jeśli odpowiedź == MessageBox.Tak:
return_value = self.save_current_file ()
Jeśli return_value == false:
wydarzenie.ignorować()
elif odpowiedź == Messagebox.NIE:
wydarzenie.zaakceptować()
w przeciwnym razie:
wydarzenie.ignorować()

Pudełko alarmowe „nieprawidłowe plik” nie ma żadnych dzwonków i gwizdków. Po prostu przekazuje wiadomość, że ścieżki pliku nie można określić.

def invalid_path_alert_message (self):
MessageBox = qMessageBox ()
skrzynka pocztowa.setWindowTitle („nieprawidłowy plik”)
skrzynka pocztowa.setText („Wybrana nazwa pliku lub ścieżka jest nieprawidłowa. Wybierz prawidłowy plik.")
skrzynka pocztowa.exec ()

Wreszcie, główna pętla aplikacji do obsługi zdarzeń i rysowania widżetów rozpoczyna się przy użyciu „.metoda exec_ () ”.

Jeśli __name__ == '__main__':
app = qapplication (sys.Argv)
w = okno ()
w.showmaximized ()
Sys.wyjście (aplikacja.exec_ ())

Uruchamianie aplikacji

Po prostu zapisz pełny kod na pliku tekstowym, ustaw rozszerzenie pliku na „.py ”, zaznacz plik wykonywalny i uruchom go, aby uruchomić aplikację. Na przykład, jeśli nazwa pliku brzmi „Simple_Text_Editor.py ”, musisz uruchomić dwa polecenia:

$ chmod +x prosty_text_editor.py
$ ./Simple_Text_Editor.py

Rzeczy, które możesz zrobić, aby ulepszyć kod

Wyjaśniony powyżej kod działa dobrze dla edytora tekstu bez kości. Jednak może nie być przydatne do celów praktycznych, ponieważ brakuje mu wielu funkcji powszechnie obserwowanych w dobrych redakcjach tekstowych. Możesz ulepszyć kod, dodając nowe funkcje, takie jak numery linii, podświetlenie linii, podświetlenie składni, wiele kart, zapisanie sesji, pasek narzędzi, menu rozwijane, wykrywanie zmian buforu itp.

Wniosek

W tym artykule koncentruje się głównie na zapewnieniu podstawy do tworzenia aplikacji PYQT. Jeśli znajdziesz błędy w kodzie lub chcesz coś zasugerować, opinie są mile widziane.