Python

Cara Menulis Editor Teks Sederhana di PyQt5

Cara Menulis Editor Teks Sederhana di PyQt5
Artikel ini akan membahas panduan membuat editor teks sederhana di Python3 dan PyQt5. Qt5 adalah satu set pustaka lintas platform yang ditulis dalam C++, digunakan terutama untuk membuat aplikasi grafis yang kaya. PyQt5 menyediakan binding Python untuk versi terbaru Qt5. Semua contoh kode dalam artikel ini diuji dengan Python 3.8.2 dan PyQt5 versi 5.14.1 di Ubuntu 20.04.

Menginstal PyQt5 di Linux

Untuk menginstal PyQt5 di Ubuntu versi terbaru, jalankan perintah di bawah ini:

$ sudo apt install python3-pyqt5

Jika Anda menggunakan distribusi Linux lainnya, cari istilah "Pyqt5" ​​di manajer paket dan instal dari sana. Atau, Anda dapat menginstal PyQt5 dari manajer paket pip menggunakan perintah di bawah ini:

$ pip instal pyqt5

Perhatikan bahwa di beberapa distribusi, Anda mungkin harus menggunakan perintah pip3 untuk menginstal PyQt5 dengan benar.

Kode Lengkap

Saya memposting kode lengkap sebelumnya sehingga Anda dapat lebih memahami konteks untuk masing-masing cuplikan kode yang dijelaskan nanti di artikel. Jika Anda terbiasa dengan Python dan PyQt5, Anda bisa merujuk ke kode di bawah ini dan lewati penjelasannya.

#!/usr/bin/env python3
sistem impor
dari PyQt5.QtWidgets mengimpor QWidget, QApplication, QVBoxLayout, QHBoxLayout
dari PyQt5.QtWidgets mengimpor QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
dari PyQt5.QtGui mengimpor QKeySequence
dari PyQt5 impor Qt
Jendela kelas (QWidget):
def __init__(sendiri):
super().__init__()
diri.file_path = Tidak ada
diri.open_new_file_shortcut = QSshortcut(QKeySequence('Ctrl+O'), sendiri)
diri.buka_new_file_shortcut.diaktifkan.menghubungkan (diri sendiri).buka_file_baru)
diri.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), sendiri)
diri.save_current_file_shortcut.diaktifkan.menghubungkan (diri sendiri).save_current_file)
vbox = QVBoxLayout()
teks = "File Tanpa Judul"
diri.judul = QLabel(teks)
diri.judul.setWordWrap(Benar)
diri.judul.setAlignment(Qt.Qt.SejajarkanPusat)
kotak v.tambahkan Widget (diri sendiri).judul)
diri.setTata letak (vbox)
diri.scrollable_text_area = QTextEdit()
kotak v.tambahkan Widget (diri sendiri).scrollable_text_area)
def open_new_file(sendiri):
diri.file_path, filter_type = QFileDialog.getOpenFileName(sendiri, "Buka file baru",
"", "Semua data (*)")
jika diri sendiri.file_path:
dengan terbuka (diri sendiri).file_path, "r") sebagai f:
file_isi = f.Baca()
diri.judul.setTeks(sendiri.file_path)
diri.scrollable_text_area.setText(file_contents)
lain:
diri.invalid_path_alert_message()
def save_current_file(sendiri):
jika tidak sendiri.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName(self, "Simpan file ini
sebagai… ", "", "Semua file (*)")
jika new_file_path:
diri.file_path = new_file_path
lain:
diri.invalid_path_alert_message()
kembali Salah
file_contents = diri sendiri.scrollable_text_area.toPlainText()
dengan terbuka (diri sendiri).file_path, "w") sebagai f:
f.tulis(file_contents)
diri.judul.setTeks(sendiri.file_path)
def closeEvent(diri, acara):
kotak pesan = QMessageBox()
title = "Keluar Aplikasi?"
pesan = "PERINGATAN !!\n\nJika Anda keluar tanpa menyimpan, perubahan apa pun yang dibuat pada file
akan hilang.\n\nSimpan file sebelum keluar?"
balasan = kotak pesan.pertanyaan (diri, judul, pesan, kotak pesan.Ya | kotak pesan.Tidak |
kotak pesan.Batal, Kotak Pesan.Membatalkan)
jika membalas == kotak pesan.Iya:
return_value = diri sendiri.save_current_file()
jika return_value == Salah:
peristiwa.mengabaikan()
balasan elif == kotak pesan.Tidak:
peristiwa.menerima()
lain:
peristiwa.mengabaikan()
def invalid_path_alert_message(sendiri):
kotak pesan = QMessageBox()
kotak pesan.setWindowTitle("File tidak valid")
kotak pesan.setText("Nama file atau jalur yang dipilih tidak valid. Silakan pilih
berkas yang valid.")
kotak pesan.eksekutif()
jika __name__ == '__main__':
aplikasi = QAplikasi(sys.argv)
w = Jendela()
w.tampilkan Dimaksimalkan()
sistem.keluar (aplikasi.eksekutif_())

Penjelasan

Bagian pertama dari kode hanya mengimpor modul yang akan digunakan di seluruh sampel:

sistem impor
dari PyQt5.QtWidgets mengimpor QWidget, QApplication, QVBoxLayout, QHBoxLayout
dari PyQt5.QtWidgets mengimpor QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
dari PyQt5.QtGui mengimpor QKeySequence
dari PyQt5 impor Qt

Di bagian selanjutnya, kelas baru yang disebut "Jendela" dibuat yang mewarisi dari kelas "QWidget". Kelas QWidget menyediakan komponen grafis yang umum digunakan di Qt. Dengan menggunakan "super" Anda dapat memastikan bahwa objek Qt induk dikembalikan.

Jendela kelas (QWidget):
def __init__(sendiri):
super().__init__()

Beberapa variabel didefinisikan di bagian selanjutnya. Jalur file diatur ke "Tidak Ada" secara default dan pintasan untuk membuka file menggunakan dan menyimpan file menggunakan didefinisikan menggunakan kelas QShortcut. Pintasan ini kemudian dihubungkan ke metode masing-masing yang dipanggil setiap kali pengguna menekan kombinasi tombol yang ditentukan.

diri.file_path = Tidak ada
diri.open_new_file_shortcut = QSshortcut(QKeySequence('Ctrl+O'), sendiri)
diri.buka_new_file_shortcut.diaktifkan.menghubungkan (diri sendiri).buka_file_baru)
diri.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), sendiri)
diri.save_current_file_shortcut.diaktifkan.menghubungkan (diri sendiri).save_current_file)

Menggunakan kelas QVBoxLayout, tata letak baru dibuat di mana widget anak akan ditambahkan. Label rata tengah diatur untuk nama file default menggunakan kelas QLabel.

vbox = QVBoxLayout()
teks = "File Tanpa Judul"
diri.judul = QLabel(teks)
diri.judul.setWordWrap(Benar)
diri.judul.setAlignment(Qt.Qt.SejajarkanPusat)
kotak v.tambahkan Widget (diri sendiri).judul)
diri.setTata letak (vbox)

Selanjutnya, area teks ditambahkan ke tata letak menggunakan objek QTextEdit. Widget QTextEdit akan memberi Anda area yang dapat diedit dan dapat digulir untuk digunakan. Widget ini mendukung salin, tempel, potong, batalkan, ulangi, pilih semua, dll. pintasan keyboard. Anda juga dapat menggunakan menu konteks klik kanan di dalam area teks.

diri.scrollable_text_area = QTextEdit()
kotak v.tambahkan Widget (diri sendiri).scrollable_text_area)

Metode "open_new_fie" dipanggil ketika pengguna selesai pintasan keyboard. Kelas QFileDialog menyajikan dialog pemilih file kepada pengguna. Jalur file ditentukan setelah pengguna memilih file dari pemilih. Jika jalur file valid, konten teks dibaca dari file dan disetel ke widget QTextEdit. Ini membuat teks terlihat oleh pengguna, mengubah judul menjadi nama file baru dan menyelesaikan proses pembukaan file baru. Jika karena alasan tertentu, jalur file tidak dapat ditentukan, kotak peringatan "file tidak valid" ditampilkan kepada pengguna.

def open_new_file(sendiri):
diri.file_path, filter_type = QFileDialog.getOpenFileName(sendiri, "Buka file baru", "",
"Semua data (*)")
jika diri sendiri.file_path:
dengan terbuka (diri sendiri).file_path, "r") sebagai f:
file_isi = f.Baca()
diri.judul.setTeks(sendiri.file_path)
diri.scrollable_text_area.setText(file_contents)
lain:
diri.invalid_path_alert_message()

Metode "save_current_file" dipanggil setiap kali pengguna selesai pintasan keyboard. Alih-alih mengambil jalur file baru, QFileDialog sekarang meminta pengguna untuk menyediakan jalur. Jika jalur file valid, konten yang terlihat di widget QTextEdit ditulis ke jalur file lengkap, jika tidak, kotak peringatan "file tidak valid" akan ditampilkan. Judul file yang sedang diedit juga diubah ke lokasi baru yang disediakan oleh pengguna.

def save_current_file(sendiri):
jika tidak sendiri.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName(self, "Simpan file ini
sebagai… ", "", "Semua file (*)")
jika new_file_path:
diri.file_path = new_file_path
lain:
diri.invalid_path_alert_message()
kembali Salah
file_contents = diri sendiri.scrollable_text_area.toPlainText()
dengan terbuka (diri sendiri).file_path, "w") sebagai f:
f.tulis(file_contents)
diri.judul.setTeks(sendiri.file_path)

Metode "closeEvent" adalah bagian dari API penanganan peristiwa PyQt5. Metode ini dipanggil setiap kali pengguna mencoba menutup jendela menggunakan tombol silang atau dengan menekan kombinasi tombol. Pada penembakan acara dekat, pengguna diperlihatkan kotak dialog dengan tiga pilihan: "Ya", "Tidak" dan "Batal". Tombol "Ya" menyimpan file dan menutup aplikasi sementara tombol "Tidak" menutup file tanpa menyimpan isinya. Tombol "Batal" menutup kotak dialog dan membawa pengguna kembali ke aplikasi.

def closeEvent(diri, acara):
kotak pesan = QMessageBox()
title = "Keluar Aplikasi?"
pesan = "PERINGATAN !!\n\nJika Anda keluar tanpa menyimpan, setiap perubahan yang dibuat pada file akan
tersesat.\n\nSimpan file sebelum keluar?"
balasan = kotak pesan.pertanyaan (diri, judul, pesan, kotak pesan.Ya | kotak pesan.Tidak |
kotak pesan.Batal, Kotak Pesan.Membatalkan)
jika membalas == kotak pesan.Iya:
return_value = diri sendiri.save_current_file()
jika return_value == Salah:
peristiwa.mengabaikan()
balasan elif == kotak pesan.Tidak:
peristiwa.menerima()
lain:
peristiwa.mengabaikan()

Kotak peringatan "file tidak valid" tidak memiliki lonceng dan peluit. Itu hanya menyampaikan pesan bahwa jalur file tidak dapat ditentukan.

def invalid_path_alert_message(sendiri):
kotak pesan = QMessageBox()
kotak pesan.setWindowTitle("File tidak valid")
kotak pesan.setText("Nama file atau jalur yang dipilih tidak valid. Silakan pilih file yang valid.")
kotak pesan.eksekutif()

Terakhir, loop aplikasi utama untuk penanganan event dan menggambar widget dimulai dengan menggunakan ".exec_()” metode.

jika __name__ == '__main__':
aplikasi = QAplikasi(sys.argv)
w = Jendela()
w.tampilkan Dimaksimalkan()
sistem.keluar (aplikasi.eksekutif_())

Menjalankan Aplikasi

Cukup simpan kode lengkap ke file teks, atur ekstensi file ke “.py", tandai file yang dapat dieksekusi dan jalankan untuk meluncurkan aplikasi. Misalnya, jika nama file adalah “simple_text_editor.py", Anda perlu menjalankan dua perintah berikut:

$ chmod +x simple_text_editor.py
$ ./simple_text_editor.py

Hal yang Dapat Anda Lakukan untuk Meningkatkan Kode

Kode yang dijelaskan di atas berfungsi dengan baik untuk editor teks sederhana. Namun, ini mungkin tidak berguna untuk tujuan praktis karena tidak memiliki banyak fitur yang biasa terlihat di editor teks yang bagus. Anda dapat meningkatkan kode dengan menambahkan fitur baru seperti nomor baris, penyorotan baris, penyorotan sintaks, banyak tab, penyimpanan sesi, bilah alat, menu tarik-turun, deteksi perubahan buffer, dll.

Kesimpulan

Artikel ini terutama berfokus pada penyediaan landasan awal untuk membuat aplikasi PyQt. Jika Anda menemukan kesalahan dalam kode atau ingin menyarankan sesuatu, umpan balik dipersilahkan.

Game Terbaik untuk Dimainkan dengan Pelacakan Tangan
Oculus Quest baru-baru ini memperkenalkan ide hebat pelacakan tangan tanpa pengontrol. Dengan jumlah permainan dan aktivitas yang terus meningkat yang...
Cara Menampilkan Overlay OSD di Aplikasi dan Game Linux Layar Penuh
Memainkan game layar penuh atau menggunakan aplikasi dalam mode layar penuh bebas gangguan dapat memutus Anda dari informasi sistem yang relevan yang ...
5 Kartu Tangkap Game Teratas
Kita semua telah melihat dan menyukai gameplay streaming di YouTube. PewDiePie, Jakesepticye, dan Markiplier hanyalah beberapa pemain top yang telah m...