Python

Cara Menulis Penyunting Teks Ringkas di PyQt5

Cara Menulis Penyunting Teks Ringkas di PyQt5
Artikel ini akan merangkumi panduan membuat editor teks ringkas di Python3 dan PyQt5. Qt5 adalah sekumpulan perpustakaan lintas platform yang ditulis dalam C ++, digunakan terutamanya untuk membuat aplikasi grafik yang kaya. PyQt5 menyediakan pengikatan Python untuk versi terbaru Qt5. Semua sampel kod dalam artikel ini diuji dengan Python 3.8.2 dan PyQt5 versi 5.14.1 di Ubuntu 20.04.

Memasang PyQt5 di Linux

Untuk memasang PyQt5 dalam versi terbaru Ubuntu, jalankan arahan di bawah:

$ sudo apt pasangkan python3-pyqt5

Sekiranya anda menggunakan sebaran Linux lain, cari istilah "Pyqt5" ​​di pengurus pakej dan pasangkan dari sana. Sebagai alternatif, anda boleh memasang PyQt5 dari pengurus pakej pip menggunakan arahan di bawah:

$ pip memasang pyqt5

Perhatikan bahawa dalam beberapa pengedaran, anda mungkin harus menggunakan perintah pip3 untuk memasang PyQt5 dengan betul.

Kod Penuh

Saya mengeposkan kod penuh terlebih dahulu supaya anda dapat memahami konteks untuk coretan kod individu yang dijelaskan kemudian dalam artikel. Sekiranya anda biasa dengan Python dan PyQt5, anda hanya boleh merujuk kepada kod di bawah ini dan melangkau penjelasannya.

#!/ usr / bin / env python3
import sys
dari PyQt5.QtWidgets mengimport QWidget, QApplication, QVBoxLayout, QHBoxLayout
dari PyQt5.QtWidgets mengimport QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
dari PyQt5.QtGui mengimport QKeySequence
dari PyQt5 import Qt
tetingkap kelas (QWidget):
def __init __ (diri):
super ().__di dalamnya__()
diri.file_path = Tiada
diri.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), diri)
diri.buka_new_file_shortcut.diaktifkan.menyambung (diri.buka_baru_file)
diri.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), diri)
diri.save_current_file_shortcut.diaktifkan.menyambung (diri.save_current_file)
vbox = QVBoxLayout ()
teks = "Fail Tanpa Judul"
diri.tajuk = QLabel (teks)
diri.tajuk.setWordWrap (Betul)
diri.tajuk.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (diri.tajuk)
diri.setLayout (vbox)
diri.scrollable_text_area = QTextEdit ()
vbox.addWidget (diri.scrollable_text_area)
def open_new_file (diri):
diri.file_path, filter_type = QFileDialog.getOpenFileName (diri, "Buka fail baru",
"", "Semua fail (*)")
sekiranya diri.file_path:
dengan terbuka (diri.file_path, "r") sebagai f:
fail_contents = f.baca ()
diri.tajuk.setText (diri.fail_path)
diri.scrollable_text_area.setText (fail_contents)
lain:
diri.tidak sah_path_alert_message ()
def save_current_file (diri):
jika bukan diri.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (diri, "Simpan fail ini
sebagai… "," "," Semua fail (*) ")
jika_file_path baru:
diri.file_path = new_file_path
lain:
diri.tidak sah_path_alert_message ()
kembali Palsu
file_contents = diri.scrollable_text_area.kePlainTeks ()
dengan terbuka (diri.file_path, "w") sebagai f:
f.tulis (kandungan_kod)
diri.tajuk.setText (diri.fail_path)
def closeEvent (diri, acara):
messageBox = QMessageBox ()
tajuk = "Berhenti Permohonan?"
mesej = "AMARAN !!\ n \ nJika anda berhenti tanpa menyimpan, perubahan yang dibuat pada fail
akan hilang.\ n \ nSimpan fail sebelum berhenti?"
balas = messageBox.soalan (diri, tajuk, mesej, messageBox.Ya | Kotak mesej.Tidak |
Kotak mesej.Batalkan, messageBox.Batal)
jika membalas == messageBox.Ya:
return_value = diri.save_current_file ()
jika return_value == Salah:
peristiwa.abai()
balasan elif == messageBox.Tidak:
peristiwa.terima ()
lain:
peristiwa.abai()
def valid_path_alert_message (diri):
messageBox = QMessageBox ()
Kotak mesej.setWindowTitle ("Fail tidak sah")
Kotak mesej.setText ("Nama fail atau jalan yang dipilih tidak sah. Sila pilih a
fail yang sah.")
Kotak mesej.exec ()
jika __nama__ == '__main__':
app = QApplication (sys.berhujah)
w = Tingkap ()
w.tayanganMaksimum ()
sys.keluar (aplikasi.exec_ ())

Penjelasan

Bahagian pertama kod hanya mengimport modul yang akan digunakan di seluruh sampel:

import sys
dari PyQt5.QtWidgets mengimport QWidget, QApplication, QVBoxLayout, QHBoxLayout
dari PyQt5.QtWidgets mengimport QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
dari PyQt5.QtGui mengimport QKeySequence
dari PyQt5 import Qt

Di bahagian seterusnya, kelas baru yang disebut "Window" dibuat yang mewarisi dari kelas "QWidget". Kelas QWidget menyediakan komponen grafik yang biasa digunakan di Qt. Dengan menggunakan "super" anda dapat memastikan bahawa objek Qt induk dikembalikan.

tetingkap kelas (QWidget):
def __init __ (diri):
super ().__di dalamnya__()

Beberapa pemboleh ubah ditakrifkan di bahagian seterusnya. Laluan fail ditetapkan ke "Tidak ada" secara lalai dan jalan pintas untuk membuka fail menggunakan dan menyimpan fail menggunakan ditakrifkan menggunakan kelas QShortcut. Jalan pintas ini kemudian disambungkan ke kaedah masing-masing yang dipanggil setiap kali pengguna menekan kombinasi kekunci yang ditentukan.

diri.file_path = Tiada
diri.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), diri)
diri.buka_new_file_shortcut.diaktifkan.menyambung (diri.buka_baru_file)
diri.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), diri)
diri.save_current_file_shortcut.diaktifkan.menyambung (diri.save_current_file)

Menggunakan kelas QVBoxLayout, susun atur baru dibuat untuk widget anak yang akan ditambahkan. Label sejajar tengah ditetapkan untuk nama fail lalai menggunakan kelas QLabel.

vbox = QVBoxLayout ()
teks = "Fail Tanpa Judul"
diri.tajuk = QLabel (teks)
diri.tajuk.setWordWrap (Betul)
diri.tajuk.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (diri.tajuk)
diri.setLayout (vbox)

Seterusnya, kawasan teks ditambahkan ke susun atur menggunakan objek QTextEdit. Widget QTextEdit akan memberi anda kawasan yang boleh diedit dan boleh ditatal untuk dikerjakan. Widget ini menyokong salinan khas, tampal, potong, buat asal, buat semula, pilih-semua dll. pintasan papan kekunci. Anda juga dapat menggunakan menu konteks klik kanan dalam kawasan teks.

diri.scrollable_text_area = QTextEdit ()
vbox.addWidget (diri.scrollable_text_area)

Kaedah "open_new_fie" dipanggil apabila pengguna selesai jalan pintas papan kekunci. Kelas QFileDialog membentangkan dialog pemilih fail kepada pengguna. Laluan fail ditentukan setelah pengguna memilih fail dari pemilih. Sekiranya jalur fail sah, kandungan teks dibaca dari fail dan ditetapkan ke widget QTextEdit. Ini menjadikan teks dapat dilihat oleh pengguna, mengubah judul menjadi nama file baru dan menyelesaikan proses membuka file baru. Sekiranya atas sebab tertentu, jalur fail tidak dapat ditentukan, kotak amaran "fail tidak sah" ditunjukkan kepada pengguna.

def open_new_file (diri):
diri.file_path, filter_type = QFileDialog.getOpenFileName (diri, "Buka fail baru", "",
"Semua fail (*)")
sekiranya diri.file_path:
dengan terbuka (diri.file_path, "r") sebagai f:
fail_contents = f.baca ()
diri.tajuk.setText (diri.fail_path)
diri.scrollable_text_area.setText (fail_contents)
lain:
diri.tidak sah_path_alert_message ()

Kaedah "save_current_file" dipanggil setiap kali pengguna selesai jalan pintas papan kekunci. Daripada mengambil jalan fail baru, QFileDialog kini meminta pengguna memberikan jalan. Sekiranya jalur fail sah, kandungan yang dapat dilihat dalam widget QTextEdit ditulis ke jalur fail penuh, jika tidak, kotak amaran "fail tidak sah" ditunjukkan. Tajuk fail yang sedang diedit juga diubah ke lokasi baru yang disediakan oleh pengguna.

def save_current_file (diri):
jika bukan diri.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (diri, "Simpan fail ini
sebagai… "," "," Semua fail (*) ")
jika_file_path baru:
diri.file_path = new_file_path
lain:
diri.tidak sah_path_alert_message ()
kembali Palsu
file_contents = diri.scrollable_text_area.kePlainTeks ()
dengan terbuka (diri.file_path, "w") sebagai f:
f.tulis (kandungan_kod)
diri.tajuk.setText (diri.fail_path)

Kaedah "closeEvent" adalah sebahagian daripada API pengendalian acara PyQt5. Kaedah ini dipanggil setiap kali pengguna cuba menutup tetingkap menggunakan butang silang atau dengan menekan gabungan utama. Pada penembakan acara penutupan, pengguna ditunjukkan kotak dialog dengan tiga pilihan: "Ya", "Tidak" dan "Batal". Butang "Ya" menyimpan fail dan menutup aplikasi sementara butang "Tidak" menutup fail tanpa menyimpan isinya. Butang "Batal" menutup kotak dialog dan membawa pengguna kembali ke aplikasi.

def closeEvent (diri, acara):
messageBox = QMessageBox ()
tajuk = "Berhenti Permohonan?"
mesej = "AMARAN !!\ n \ nJika anda berhenti tanpa menyimpan, perubahan yang dibuat pada fail akan berlaku
hilang.\ n \ nSimpan fail sebelum berhenti?"
balas = messageBox.soalan (diri, tajuk, mesej, messageBox.Ya | Kotak mesej.Tidak |
Kotak mesej.Batalkan, messageBox.Batal)
jika membalas == messageBox.Ya:
return_value = diri.save_current_file ()
jika return_value == Salah:
peristiwa.abai()
balasan elif == messageBox.Tidak:
peristiwa.terima ()
lain:
peristiwa.abai()

Kotak amaran "fail tidak sah" tidak mempunyai loceng dan wisel. Ini hanya menyampaikan mesej bahawa jalan fail tidak dapat ditentukan.

def valid_path_alert_message (diri):
messageBox = QMessageBox ()
Kotak mesej.setWindowTitle ("Fail tidak sah")
Kotak mesej.setText ("Nama fail atau jalan yang dipilih tidak sah. Sila pilih fail yang sah.")
Kotak mesej.exec ()

Terakhir, gelung aplikasi utama untuk pengendalian acara dan menggambar widget dimulakan dengan menggunakan ".kaedah exec_ () ”.

jika __nama__ == '__main__':
app = QApplication (sys.berhujah)
w = Tingkap ()
w.tayanganMaksimum ()
sys.keluar (aplikasi.exec_ ())

Menjalankan Aplikasi

Cukup simpan kod penuh ke fail teks, tetapkan peluasan fail ke ".py ”, tandakan fail yang boleh dilaksanakan dan jalankan untuk melancarkan aplikasi. Contohnya, jika nama file adalah “simple_text_editor.py ”, anda perlu menjalankan dua perintah berikut:

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

Perkara yang Boleh Anda Lakukan untuk Memperbaiki Kod

Kod yang dijelaskan di atas berfungsi dengan baik untuk penyunting teks tanpa tulang. Walau bagaimanapun, ia mungkin tidak berguna untuk tujuan praktikal kerana ia tidak mempunyai banyak ciri yang biasa dilihat pada editor teks yang baik. Anda boleh meningkatkan kod dengan menambahkan ciri baru seperti nombor baris, penyorotan baris, penyorotan sintaks, beberapa tab, penjimatan sesi, bar alat, menu lungsur, pengesanan perubahan penyangga dll.

Kesimpulannya

Artikel ini memfokuskan terutamanya pada penyediaan permulaan untuk membuat aplikasi PyQt. Sekiranya anda menemui kesilapan dalam kod atau ingin mencadangkan sesuatu, maklum balas diterima.

Battle For Wesnoth 1.13.6 Pembangunan Dikeluarkan
Battle For Wesnoth 1.13.6 dilancarkan bulan lalu, adalah rilis pengembangan keenam di 1.13.siri x dan memberikan sejumlah penambahbaikan, terutamanya ...
Cara Memasang League Of Legends di Ubuntu 14.04
Sekiranya anda peminat League of Legends, maka ini adalah peluang bagi anda untuk menguji menjalankan League of Legends. Perhatikan bahawa LOL disokon...
Pasang permainan Strategi OpenRA terkini di Ubuntu Linux
OpenRA adalah mesin permainan Strategi Masa Nyata / Bebas yang mencipta semula permainan Westwood awal seperti Command & Conquer klasik: Makluman Mera...