Construindo um rastreador de portfólio de criptografia com pyqt6
Eu tenho experimentado a biblioteca PYQT6, construindo um pequeno projeto de estimação: um rastreador de portfólio de criptografia leve. A idéia era mover um dos meus scripts da linha de comando para um aplicativo de desktop adequado-carregar um CSV com minhas participações, buscar preços ao vivo da Kraken e mostrar tudo em uma tabela. Acabou sendo uma maneira divertida de explorar os layouts, encadeamento e manuseio de eventos do PYQT6. Visão geral do projeto O aplicativo fornece três ações principais: Carregar portfólio – importe um arquivo de participações CSV. Atualizar preços – busque os preços atuais da API Kraken. Export CSV – Salve os dados atualizados de volta ao disco. Ao longo do caminho, adicionei multithreading (para que a interface do usuário permaneça responsiva), um sistema de registro e um arquivo de configuração para mapear símbolos do portfólio para os pares de negociação de Kraken. A interface do usuário do núcleo em que a janela principal é composta: um qtablewidget para botões de dados do portfólio para carga, atualização e exportação. def setUi (self): self.setwindowtitle (“criptotracker”) self.portfolio = pd.dataframe (colunns =[“symbol”, “amount”, “price”, “total_value”]) self.table = qtablewidget () self.btn_load = qpushbutton (“Carregar portfólio csv”) self.btn_load.clicked.connect (self.load_portfolio) self.btn_refresh = qpushbutton (“refreschonRect preços”) self.bt_refReD.click.click.click.click. = Qpushbutton (“exportar para csv”) self.btn_export.clicked.connect (self.export_csv) layout = qvboxlayout () layout.addwidget (selfdget) layout.addwidget (selfbtn_load) layout.addwidget (selftn) container = qwidget () container.setLayout (layout) self.setCentralWidget (contêiner) Digite o modo de tela cheia de tela cheia de tela cheia carregando o portfólio Um arquivo CSV simples aciona o aplicativo. Clicar em Carregar portfólio abre uma caixa de diálogo de arquivo, carrega os dados em um pandas.dataframe e o exibe na tabela. def load_portfolio (self): file_name, _ = qfiledialog.getOpenfilename (self, “abre csv”, “”, “csv arquivos (*.csv)”) se file_name: self.portfolio = pd.read_csv (file_name) slogger.info (fadfo ” Self.Update_table () Digite o modo de tela cheia Exemplo de tela cheia portfólio.csv: símbolo, quantidade BTC, 0,05 eth, 0,7 DOGE, 1000 Digite o modo de tela cheia de tela Full -theolt Blocking preços de Block (com o Tool da Tool, o FetthP, que é mais importante que o time de time de tiro de tela. classe de classe (QRUNNABLE): def __init __ (self, fn, *args, ** kwargs): super () .__ init __ () self.fn = fn self.args = args self.kwargs = kwargs @pyqtslot () def run (self): self.fn (self *.args = kwargs @pyqtslot () def Modo de tela completa Quando o usuário clica nos preços da atualização, cada símbolo é processado em um thread de trabalhador separado: def refresh_prices (self): se self.portfolio.empty: self.logger.error (“nenhum dado encontrado no portfólio”) retorna para sym em self.portfolio[“symbol”]: kraken_pair = self.config[‘KrakenSymbols’][sym.upper()]
trabalhador = trabalhador (self.update_pair_info, kraken_pair, sym) self.threadpool.start (trabalhador) insira o modo de tela cheia Sair
[KrakenSymbols]
Btc = xxbtzusd eth = xethzusd doge = xdgusd USDT = USDTZUSD SOL = SOLUSD Digite o modo de tela cheia Sair do modo de tela completa Atualizando a tabela Após a busca de preços, o aplicativo) atualiza o quadro de dados e a tabela Visible: def Atualize_table (auto): Self. self.table.setColumnCount(len(self.portfolio.columns)) self.table.setHorizontalHeaderLabels(self.portfolio.columns) for i, row in self.portfolio.iterrows(): for j, col in enumerate(self.portfolio.columns): self.table.setItem(i, j, QTableWidgetItem(str(row[col]))) Digite o modo de saída de tela cheia de tela cheia cada linha e depois mostra: Symbol (por exemplo, BTC) Valor (do CSV) Preço (do Kraken) Total_Value (Montante × Preço) Log para acompanhar o que está acontecendo, adicionei um logger simples que grava tanto para app.log quanto o console. Isso foi especialmente útil ao depurar as respostas da API e a embalagem do PyInstaller. As lições aprendidas de rosqueamento são cruciais: sem ele, a interface do usuário congelou enquanto aguarda as respostas do Kraken. Os layouts PYQT6 são flexíveis, mas os layouts aninhados fazem algumas tentativas e erros. O PyInstaller funciona, mas você precisa lidar com recursos em pacote como o Config.ini com cuidado (SYS._MEIPASS truque). A combinação de pandas com um QTableWidget facilita a manutenção da GUI e dos dados em sincronia. A demonstração da demonstração pode ser encontrada aqui: a fonte do código -fonte pode ser encontrada aqui:
Fonte