Instalando PyQt5 no Linux
Para instalar o PyQt5 na versão mais recente do Ubuntu, execute o comando abaixo:
$ sudo apt install python3-pyqt5Se você estiver usando qualquer outra distribuição Linux, procure o termo “Pyqt5” no gerenciador de pacotes e instale-o a partir daí. Como alternativa, você pode instalar o PyQt5 a partir do gerenciador de pacotes pip usando o comando abaixo:
$ pip install pyqt5Observe que, em algumas distribuições, pode ser necessário usar o comando pip3 para instalar corretamente o PyQt5.
Código Completo
Estou postando o código completo de antemão para que você possa entender melhor o contexto de snippets de código individuais explicados posteriormente neste artigo. Se você estiver familiarizado com Python e PyQt5, pode apenas consultar o código abaixo e pular a explicação.
#!/ usr / bin / env python3import sys
de PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui import QKeySequence
de PyQt5 import Qt
classe Window (QWidget):
def __init __ (self):
super().__iniciar__()
auto.file_path = Nenhum
auto.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
auto.open_new_file_shortcut.ativado.conectar (eu mesmo.open_new_file)
auto.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
auto.save_current_file_shortcut.ativado.conectar (eu mesmo.save_current_file)
vbox = QVBoxLayout ()
text = "Arquivo sem título"
auto.title = QLabel (texto)
auto.título.setWordWrap (True)
auto.título.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.título)
auto.setLayout (vbox)
auto.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)
def open_new_file (self):
auto.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir novo arquivo",
"", "Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.leitura()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
senão:
auto.invalid_path_alert_message ()
def save_current_file (self):
se não for eu.caminho de arquivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Salve este arquivo
como… "," "," Todos os arquivos (*) ")
if new_file_path:
auto.file_path = new_file_path
senão:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.toPlainText ()
com aberto (self.file_path, "w") como f:
f.escrever (file_contents)
auto.título.setText (self.caminho de arquivo)
def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Sair do aplicativo?"
mensagem = "AVISO !!\ n \ nSe você sair sem salvar, quaisquer alterações feitas no arquivo
será perdido.\ n \ nSalve o arquivo antes de sair?"
reply = messageBox.question (self, title, message, messageBox.Sim | caixa de mensagem.Não
caixa de mensagem.Cancelar, messageBox.Cancelar)
if reply == messageBox.Sim:
return_value = self.save_current_file ()
if return_value == False:
evento.ignorar()
elif reply == messageBox.Não:
evento.aceitar()
senão:
evento.ignorar()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
caixa de mensagem.setWindowTitle ("Arquivo inválido")
caixa de mensagem.setText ("O nome do arquivo ou caminho selecionado nãoéválido. Selecione um
arquivo válido.")
caixa de mensagem.exec ()
if __name__ == '__main__':
app = QApplication (sys.argv)
w = janela ()
C.showMaximized ()
sys.sair (app.exec_ ())
Explicação
A primeira parte do código importa apenas módulos que serão usados em todo o exemplo:
import sysde PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui import QKeySequence
de PyQt5 import Qt
Na próxima parte, uma nova classe chamada “Window” é criada que herda da classe “QWidget”. A classe QWidget fornece componentes gráficos comumente usados em Qt. Usando "super" você pode garantir que o objeto Qt pai seja retornado.
classe Window (QWidget):def __init __ (self):
super().__iniciar__()
Algumas variáveis são definidas na próxima parte. O caminho do arquivo é definido como "Nenhum" por padrão e atalhos para abrir um arquivo usando
auto.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
auto.open_new_file_shortcut.ativado.conectar (eu mesmo.open_new_file)
auto.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
auto.save_current_file_shortcut.ativado.conectar (eu mesmo.save_current_file)
Usando a classe QVBoxLayout, um novo layout é criado ao qual os widgets filhos serão adicionados. Um rótulo alinhado ao centro é definido para o nome do arquivo padrão usando a classe QLabel.
vbox = QVBoxLayout ()text = "Arquivo sem título"
auto.title = QLabel (texto)
auto.título.setWordWrap (True)
auto.título.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.título)
auto.setLayout (vbox)
Em seguida, uma área de texto é adicionada ao layout usando um objeto QTextEdit. O widget QTextEdit oferece uma área editável e rolável para trabalhar. Este widget suporta copiar, colar, cortar, desfazer, refazer, selecionar tudo, etc. atalhos do teclado. Você também pode usar um menu de contexto do botão direito na área de texto.
auto.scrollable_text_area = QTextEdit ()vbox.addWidget (self.scrollable_text_area)
O método “open_new_fie” é chamado quando um usuário conclui
auto.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir novo arquivo", "",
"Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.leitura()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
senão:
auto.invalid_path_alert_message ()
O método “save_current_file” é chamado sempre que um usuário conclui
se não for eu.caminho de arquivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Salve este arquivo
como… "," "," Todos os arquivos (*) ")
if new_file_path:
auto.file_path = new_file_path
senão:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.toPlainText ()
com aberto (self.file_path, "w") como f:
f.escrever (file_contents)
auto.título.setText (self.caminho de arquivo)
O método “closeEvent” faz parte da API de manipulação de eventos PyQt5. Este método é chamado sempre que um usuário tenta fechar uma janela usando o botão de cruz ou pressionando
messageBox = QMessageBox ()
title = "Sair do aplicativo?"
mensagem = "AVISO !!\ n \ nSe você sair sem salvar, quaisquer alterações feitas no arquivo
estar perdido.\ n \ nSalve o arquivo antes de sair?"
reply = messageBox.question (self, title, message, messageBox.Sim | caixa de mensagem.Não
caixa de mensagem.Cancelar, messageBox.Cancelar)
if reply == messageBox.Sim:
return_value = self.save_current_file ()
if return_value == False:
evento.ignorar()
elif reply == messageBox.Não:
evento.aceitar()
senão:
evento.ignorar()
A caixa de alerta de “arquivo inválido” não tem sinos e assobios. Ele apenas transmite a mensagem de que o caminho do arquivo não pôde ser determinado.
def invalid_path_alert_message (self):messageBox = QMessageBox ()
caixa de mensagem.setWindowTitle ("Arquivo inválido")
caixa de mensagem.setText ("O nome do arquivo ou caminho selecionado nãoéválido. Selecione um arquivo válido.")
caixa de mensagem.exec ()
Por último, o loop principal do aplicativo para manipulação de eventos e desenho de widgets é iniciado usando o botão “.método exec_ () ”.
if __name__ == '__main__':app = QApplication (sys.argv)
w = janela ()
C.showMaximized ()
sys.sair (app.exec_ ())
Executando o aplicativo
Basta salvar o código completo em um arquivo de texto e definir a extensão do arquivo como “.py ”, marque o arquivo executável e execute-o para iniciar o aplicativo. Por exemplo, se o nome do arquivo for “simple_text_editor.py ”, você precisa executar os dois comandos a seguir:
$ chmod + x simple_text_editor.py$ ./ simple_text_editor.py
Coisas que você pode fazer para melhorar o Código
O código explicado acima funciona bem para um editor de texto básico. No entanto, pode não ser útil para fins práticos, pois carece de muitos recursos comumente vistos em bons editores de texto. Você pode melhorar o código adicionando novos recursos como números de linha, realce de linha, realce de sintaxe, várias guias, salvamento de sessão, barra de ferramentas, menus suspensos, detecção de alteração de buffer, etc.
Conclusão
Este artigo se concentra principalmente em fornecer um ponto de partida para a criação de aplicativos PyQt. Se você encontrar erros no código ou quiser sugerir algo, o feedback é bem-vindo.