j6n1nhas Posted May 4, 2020 at 05:11 PM Report Share #618012 Posted May 4, 2020 at 05:11 PM (edited) Olá caros companheiros; É a minha primeira publicação. No tempo da faculdade fiquei vidrado em C, mas não consegui continuar e acabei por não entrar no mercado de trabalho. Largos anos depois, há 1 ano sofri um acidente de trabalho que me escavacou a mão toda e desde então que tenho vindo a dedicar-me a Python. Depois de passar o básico da linguagem, tenho vindo a explorar as bibliotecas e depois de passar por django, agora é a vez de PyQt5. É extremamente complexo e há muitos conceitos que eu não conheço e antes de perceber como funcionam, preciso de saber o que são, por isso, está a levar algum tempo. A documentação é extremamente extensa, mas seca e técnica ao mesmo tempo. Por exemplo, estou a criar uma aplicação para chafurdar um pouco nos números nacionais do covid. Saquei os dados do SNS através de web scraping com requests e bs4, depois espetei tudo dentro de um csv e agora estou a trabalha-lo com o pandas. Na minha app, o simples facto de querer apresentar uma tabela com os dados, foi um desafio enorme para conseguir compreender o paradigma de model/view. Agora o desafio atual é conseguir apresentar gráficos na minha app. Encontrei um snippet com uma solução que na verdade funciona, mas acho-a extremamente complexa e desconfio que haverá forma mais simples de o fazer. Tenho tido alguma dificuldade em encontrar documentação mais prática e terra a terra do que aquela que se encontra na página do pyqt5. Têm alguns links porreiros (pá) com informação sobre isso que me possam aconselhar? Encontrei um guia porreiro (pá) que me está a conseguir explicar alguns conceitos básicos e essenciais do lado de matplotlib, como Figure, Axes, Axis e por aí... https://realpython.com/python-matplotlib-guide/ Já agora, deixo-vos aí a solução que encontrei para renderizar um plot na minha app: #!/usr/bin/python3 # -*- coding: utf-8 -*- import pandas as pd import matplotlib matplotlib.use('Qt5Agg') from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as fg from matplotlib.figure import Figure import matplotlib.pyplot as plt from PyQt5.QtGui import QKeySequence from PyQt5.QtWidgets import (QMainWindow, QAction, QApplication, QLabel, QTableView, QHBoxLayout, QMenu, QTabWidget, QFrame, QGroupBox, QCheckBox, QGridLayout) from PyQt5.QtCore import QAbstractTableModel, QModelIndex, QVariant, Qt class MyApp(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.ficheiro = 'covid.csv' self.setWindowTitle("Dados COVID Portugal") self.setGeometry(10, 10, 1000, 600) self.criar_widgets() self.criar_menus() self.setCentralWidget(self.grupo) def criar_widgets(self): self.grafico = MyCanvas() self.dados = pd.read_csv(self.ficheiro) grafico = self.dados.plot(x='Data', y=['Casos confirmados', 'Mortos', 'Em vigilância', 'Casos recuperados', 'A aguardar resultado', 'Casos suspeitos', 'Casos não confirmados'], kind='line', figsize=(20, 20), title='Números COVID em Portugal', grid=True) self.dados.plot(ax=self.grafico.axes) self.show() class MyCanvas(FigureCanvasQTAgg): def __init__(self, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) super(MyCanvas, self).__init__(fig) O código não está pronto a correr, porque entretanto pus-me a chafurdar nele à procura de novas soluções e neste momento está a modos que "partido". Meti só os imports que estou a fazer, embora no excerto não esteja a usá-los todos, e a parte que interessa para o gráfico. Ora, a ideia que encontrei foi criar uma classe que herda de FigureCanvasQTAgg para depois instanciá-la na aplicação e usá-la para renderizar o gráfico. Não liguem à indentação; partam do princípio que está correta porque no editor está tudo bem e depois quando passo para aqui, fica assim como se pode ver. Se alguém tiver alguma ideia mais simples de fazer isto, sem ter de criar uma classe, por exemplo, agradecia a dica. Entretanto vou continuar a batalhar para conseguir apresentar uma versão compacta que corra, para ajudar também que me possa vir a ajudar. Abraços, cumprimentos e saudações! Edited May 4, 2020 at 05:16 PM by j6n1nhas Link to comment Share on other sites More sharing options...
M6 Posted May 6, 2020 at 09:24 AM Report Share #618041 Posted May 6, 2020 at 09:24 AM Viva. 🙂 Normalmente quando uso QT recorro ao wxFormBuilder, para desenhar os ecrãs, e à herança para por forma a poder manipular o output do wxFormBuilder sem estragar tudo cada vez que faço uma alteração na interface. O padrão de model-view (MV) é uma derivação do model-view-controller (MVC) onde o controlador e a view ficam fundidos. Na verdade é bastante simples de compreender. Tudo o que seja dados, as suas regras e a sua manipulação é model, e é ai que tal deve ser tratado. Tudo o que seja visualização, design, look, objetos, interações com o utilizador, etc. é view, é aí que tal deve ser tratado. Tudo o resto, ou seja controlar os acessos aos dados, controlar a interface, validar segurança, etc. é controller. No teu caso, a view e o controller estão juntos porque é no mesmo local que manipulas a interface (por exemplo, escondes opções de menu ou desabilitas botões), recebes o input do utilizador (por exemplo um click num botão) e fazes a comunicação com o model (recebendo e enviando dados). A ideia de herdares do FigureCanvasQTAgg para receber informação do Pandas e desenhar parece-me à partida, boa. Seria, pelo menos, uma hipótese que eu consideraria. PS: não sei se isso é só um "exercício de carolice" ou se pretendes fazer análise mais profunda. Se queres fazer análises mais profundas, aconselho-te a usares o R. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now