Installerar PyQt5 i Linux
För att installera PyQt5 i den senaste versionen av Ubuntu, kör du kommandot nedan:
$ sudo apt installera python3-pyqt5Om du använder någon annan Linux-distribution, sök efter termen “Pyqt5” i pakethanteraren och installera den därifrån. Alternativt kan du installera PyQt5 från pip-pakethanteraren med kommandot nedan:
$ pip installera pyqt5Observera att i vissa distributioner kan du behöva använda pip3-kommandot för att korrekt installera PyQt5.
Fullständig kod
Jag publicerar fullständig kod i förväg så att du bättre kan förstå sammanhanget för enskilda kodavsnitt som förklaras senare i artikeln. Om du känner till Python och PyQt5 kan du bara hänvisa till koden nedan och hoppa över förklaringen.
#!/ usr / bin / env python3importera sys
från PyQt5.QtWidgets importerar QWidget, QApplication, QVBoxLayout, QHBoxLayout
från PyQt5.QtWidgets importerar QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
från PyQt5.QtGui importerar QKeySequence
från PyQt5 importerar Qt
klassfönster (QWidget):
def __init __ (själv):
super().__i det__()
själv.file_path = Ingen
själv.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), själv)
själv.open_new_file_shortcut.aktiverad.ansluta (själv.open_new_file)
själv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), själv)
själv.save_current_file_shortcut.aktiverad.ansluta (själv.save_current_file)
vbox = QVBoxLayout ()
text = "Namnlös fil"
själv.title = QLabel (text)
själv.titel.setWordWrap (True)
själv.titel.setAlignment (Qt.Qt.Centrera i linje med)
vbox.addWidget (själv.titel)
själv.setLayout (vbox)
själv.scrollable_text_area = QTextEdit ()
vbox.addWidget (själv.rullbart_text_område)
def open_new_file (själv):
själv.file_path, filter_type = QFileDialog.getOpenFileName (själv, "Öppna ny fil",
"", "Alla filer (*)")
om själv.sökväg:
med öppen (själv.file_path, "r") som f:
file_contents = f.läsa()
själv.titel.setText (själv.sökväg)
själv.rullningsbart_textområde.setText (filinnehåll)
annan:
själv.invalid_path_alert_message ()
def save_current_file (själv):
om inte själv.sökväg:
new_file_path, filter_type = QFileDialog.getSaveFileName (själv, "Spara den här filen
som ... "," "," Alla filer (*) ")
if new_file_path:
själv.file_path = new_file_path
annan:
själv.invalid_path_alert_message ()
återvänd Falskt
file_contents = själv.rullningsbart_textområde.toPlainText ()
med öppen (själv.file_path, "w") som f:
f.skriv (filinnehåll)
själv.titel.setText (själv.sökväg)
def closeEvent (själv, händelse):
messageBox = QMessageBox ()
title = "Avsluta ansökan?"
meddelande = "VARNING !!\ n \ nOm du slutar utan att spara, görs ändringar i filen
kommer att förloras.\ n \ n Spara filen innan du slutar?"
svara = meddelandebox.fråga (själv, titel, meddelande, messageBox.Ja | meddelandebox.Nej |
meddelandebox.Avbryt, meddelandeBox.Avbryt)
om svar == meddelandeBox.Ja:
return_value = själv.save_current_file ()
if return_value == False:
händelse.strunta i()
elif svar == meddelandeBox.Nej:
händelse.acceptera()
annan:
händelse.strunta i()
def invalid_path_alert_message (själv):
messageBox = QMessageBox ()
meddelandebox.setWindowTitle ("Ogiltig fil")
meddelandebox.setText ("Valt filnamn eller sökväg är inte giltigt. Välj en
giltig fil.")
meddelandebox.exec ()
om __name__ == '__main__':
app = QApplication (sys.argv)
w = Fönster ()
w.visaMaximerad ()
sys.exit (app.exec_ ())
Förklaring
Den första delen av koden importerar bara moduler som kommer att användas i hela provet:
importera sysfrån PyQt5.QtWidgets importerar QWidget, QApplication, QVBoxLayout, QHBoxLayout
från PyQt5.QtWidgets importerar QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
från PyQt5.QtGui importerar QKeySequence
från PyQt5 importerar Qt
I nästa del skapas en ny klass som heter "Window" som ärver från "QWidget" -klassen. QWidget-klassen tillhandahåller vanliga grafiska komponenter i Qt. Genom att använda “super” kan du se till att det överordnade Qt-objektet returneras.
klassfönster (QWidget):def __init __ (själv):
super().__i det__()
Vissa variabler definieras i nästa del. Filvägen är som standard inställd på "Ingen" och genvägar för att öppna en fil med
själv.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), själv)
själv.open_new_file_shortcut.aktiverad.ansluta (själv.open_new_file)
själv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), själv)
själv.save_current_file_shortcut.aktiverad.ansluta (själv.save_current_file)
Med hjälp av QVBoxLayout-klassen skapas en ny layout som underordnade widgets läggs till. En mittjusterad etikett ställs in för standardfilnamnet med hjälp av QLabel-klassen.
vbox = QVBoxLayout ()text = "Namnlös fil"
själv.title = QLabel (text)
själv.titel.setWordWrap (True)
själv.titel.setAlignment (Qt.Qt.Centrera i linje med)
vbox.addWidget (själv.titel)
själv.setLayout (vbox)
Därefter läggs ett textområde till layouten med ett QTextEdit-objekt. QTextEdit-widgeten ger dig ett redigerbart, rullningsbart område att arbeta med. Denna widget stöder typisk kopiering, klistra in, klipp ut, ångra, göra om, markera allt osv. tangentbordsgenvägar. Du kan också använda en snabbmeny i textområdet.
själv.scrollable_text_area = QTextEdit ()vbox.addWidget (själv.rullbart_text_område)
Metoden “open_new_fie” kallas när en användare slutför
själv.file_path, filter_type = QFileDialog.getOpenFileName (själv, "Öppna ny fil", "",
"Alla filer (*)")
om själv.sökväg:
med öppen (själv.file_path, "r") som f:
file_contents = f.läsa()
själv.titel.setText (själv.sökväg)
själv.rullningsbart_textområde.setText (filinnehåll)
annan:
själv.invalid_path_alert_message ()
Metoden “save_current_file” anropas när en användare slutför
om inte själv.sökväg:
new_file_path, filter_type = QFileDialog.getSaveFileName (själv, "Spara den här filen
som ... "," "," Alla filer (*) ")
if new_file_path:
själv.file_path = new_file_path
annan:
själv.invalid_path_alert_message ()
återvänd Falskt
file_contents = själv.rullningsbart_textområde.toPlainText ()
med öppen (själv.file_path, "w") som f:
f.skriv (filinnehåll)
själv.titel.setText (själv.sökväg)
Metoden ”closeEvent” är en del av PyQt5 API för händelsehantering. Denna metod kallas när en användare försöker stänga ett fönster med korsknappen eller genom att trycka på
messageBox = QMessageBox ()
title = "Avsluta ansökan?"
meddelande = "VARNING !!\ n \ nOm du slutar utan att spara kommer alla ändringar som gjorts i filen att göras
vara vilsen.\ n \ n Spara filen innan du slutar?"
svara = meddelandebox.fråga (själv, titel, meddelande, meddelandebox.Ja | meddelandebox.Nej |
meddelandebox.Avbryt, meddelandeBox.Avbryt)
om svar == meddelandeBox.Ja:
return_value = själv.save_current_file ()
if return_value == False:
händelse.strunta i()
elif svar == meddelandeBox.Nej:
händelse.acceptera()
annan:
händelse.strunta i()
Varningsrutan "Ogiltig fil" har inga klockor och visselpipor. Det förmedlar bara meddelandet att filvägen inte kunde bestämmas.
def invalid_path_alert_message (själv):messageBox = QMessageBox ()
meddelandebox.setWindowTitle ("Ogiltig fil")
meddelandebox.setText ("Valt filnamn eller sökväg är inte giltigt. Välj en giltig fil.")
meddelandebox.exec ()
Slutligen startas den huvudsakliga applikationsslingan för händelsehantering och ritning av widgets med hjälp av ".exec_ () ”-metod.
om __name__ == '__main__':app = QApplication (sys.argv)
w = Fönster ()
w.visaMaximerad ()
sys.exit (app.exec_ ())
Köra appen
Spara bara hela koden i en textfil, ställ in filtillägget till “.py ”, markera filen körbar och kör den för att starta appen. Till exempel om filnamnet är “simple_text_editor.py ”, måste du köra efter två kommandon:
$ chmod + x simple_text_editor.py$ ./ simple_text_editor.py
Saker du kan göra för att förbättra koden
Koden som förklaras ovan fungerar bra för en textredigerare med bara ben. Det kan dock inte vara användbart för praktiska ändamål, eftersom det saknar många funktioner som ofta ses i bra textredigerare. Du kan förbättra koden genom att lägga till nya funktioner som radnummer, radmarkering, syntaxmarkering, flera flikar, sessionsbesparing, verktygsfält, rullgardinsmenyer, buffertändringsdetektering etc.
Slutsats
Den här artikeln fokuserar främst på att tillhandahålla en utgångspunkt för att skapa PyQt-appar. Om du hittar fel i koden eller vill föreslå något är feedback välkommen.