Python Forum
[PyQt] start and stop websocket-client using button GUI
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] start and stop websocket-client using button GUI
#1
Hi.

I have 1 script that get data from Binance using websocket-client lib and save into data base, then second script get the best COIN from data base.
I would like put this scripts into GUI PySide6.
What I need is, press the button (btn_turn_on) to start stream and press a button (btn_turn_off) to close conection. This is possible?

import websocket
import json 
import pandas as pd 
from sqlalchemy import create_engine


engine = create_engine('sqlite:///COINS.db')
endpoint = 'wss://stream.binance.com:9443/ws/!miniTicker@arr'


def on_close(ws):
    print('Conexão encerrada!')


def on_message(ws, message):
    out = json.loads(message)
    #print(out)
    df_import(out)


def df_import(data):
    #Pegar os valores dos pares casados com USDT
    df_ = pd.DataFrame(data)
    df_ = df_[df_['s'].str.endswith('USDT')]
    df_.c = df_.c.astype(float)
    final = df_[['s','E','c']]
    for i in range(len(final)):
        row_ = final[i:i+1]
        #print(row_)
        row_[['E','c']].to_sql(row_.s.values[0], engine, index=False, if_exists='append')



ws = websocket.WebSocketApp(endpoint, on_message=on_message, on_close=on_close)
ws.run_forever()
I tryed simulate, but doen't work.
from script_1 import *
import time


ws = call_ws()
time.sleep(3)
ws.close()
Reply
#2
Hi, How can I show data from stream data and show it on QLabel?
main.py
from PySide6.QtCore import QCoreApplication
from PySide6 import QtCore 
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import (QApplication, QMainWindow)
from ui_main import Ui_MainWindow
import sys

from videos_algovibes.cotacao import CotarMoedas


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.setWindowTitle("Let's Trade")
        appIcon = QIcon(u"")
        self.setWindowIcon(appIcon)
        ##############################################
        # TOOGLE BUTTON
        self.btn_toggle.clicked.connect(self.lf_menu)
        ##############################################
        # PAGINAS DO SISTEMA
        self.btn_home.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_home))
        self.btn_contatos.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_contatos))
        self.btn_sobre.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_sobre))
        ###############################################
        # CARREGAR DADOS NO RÓTULO.
        #stream = CotarMoedas.call_ws
        #self.lb_contacao.setText(stream)
        ###############################################


    def lf_menu(self):

        width_lm = self.left_conteiner.width()

        if width_lm == 9:
            new_width_lm = 200
        else:
            new_width_lm = 9

        self.animation = QtCore.QPropertyAnimation(self.left_conteiner, b"maximumWidth")
        self.animation.setDuration(500)
        self.animation.setStartValue(width_lm)
        self.animation.setEndValue(new_width_lm)
        self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
        self.animation.start()


if __name__ == "__main__":
    cota = CotarMoedas()
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()
contacao.py
#https://www.youtube.com/watch?v=pxyaENuoZUM&list=PL9ATnizYJ7f8_opOpLnekEZNsNVUVbCZN&index=47
import websocket
import json 
import pandas as pd 
from sqlalchemy import create_engine
from threading import Thread


engine = create_engine('sqlite:///COINS.db')

class CotarMoedas:

    def __init__(self):
        self.endpoint = 'wss://stream.binance.com:9443/ws/!miniTicker@arr'
        tr = Thread(target=self.call_ws)
        tr.start()


    def df_import(self, data):
        #Pegar os valores dos pares casados com USDT
        df_ = pd.DataFrame(data)
        df_ = df_[df_['s'].str.endswith('USDT')]
        df_.c = df_.c.astype(float)
        final = df_[['s','E','c']]
        for i in range(len(final)):
            row_ = final[i:i+1]
            #print(row_)
            row_[['E','c']].to_sql(row_.s.values[0], engine, index=False, if_exists='append')


    def best_conin(self):
        engine = create_engine('sqlite:///COINS.db')
        dfs = pd.read_sql("""SELECT name FROM sqlite_master WHERE type='table'""", engine)
        tables = dfs.name.to_list()
        reutrns = []

        for table in tables:
            df__ = pd.read_sql(table,engine)
            # ret_ = (df__.tail(20).c.pct_change() + 1).prod() - 1 # Os 20 mais recentes
            ret_ = (df__.c.pct_change() + 1).prod() - 1
            reutrns.append(ret_)

        rst = pd.Series(reutrns).nlargest(10)
        rst.sort_values()
        bv = rst.to_dict()
        ls = []
        for k, v in bv.items():
            ls.append([tables[k],v])
            tt = print(tables[k],v) 
        
        return tt


    def on_close(self,ws):
        print('Conexão encerrada!')


    def on_message(self, ws, message):
        out = json.loads(message)
        #print(out)
        df_import(out)
        print('============')
        best_conin()


    def call_ws(self):
        ws = websocket.WebSocketApp(self.endpoint, on_message=self.on_message, on_close=self.on_close)
        ws.run_forever()
Reply
#3
Hi.

Please anyone?

Tks
Reply
#4
Please anyone?
Reply
#5
How can I show part of my data frame into QLabel?
Reply
#6
When you print(df) you are really doing print(str(df)). str(df) will return a str object that you can use in your label. You'll need to configure the label to use a mono-spaced font like typewriter, courier or a console font, otherwise the columns won't line up.

from PySide6.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout
from PySide6.QtGui import QFont
from pandas import DataFrame


class Window(QWidget):
    def __init__(self, df):
        super().__init__()
        label = QLabel(self, text=str(df), font=QFont('Courier', 12))
        layout = QVBoxLayout(self)
        layout.addWidget(label)


def main():
    df = DataFrame({'Letters':['A', 'B', 'C'], 'Numbers': [1, 2, 3]})
    app = QApplication()
    window = Window(df)
    window.show()
    app.exec()


main()
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Start stop button stack stergeol 5 3,883 Feb-04-2021, 07:57 PM
Last Post: stergeol
  Progressbar with start and stop jelo34 3 5,007 Nov-30-2020, 03:36 AM
Last Post: deanhystad
  [PySimpleGui] How to alter mouse click button of a standard submit button? skyerosebud 3 5,042 Jul-21-2019, 06:02 PM
Last Post: FullOfHelp
  Stop Watch star/stop problem macellan85 1 2,587 Jun-12-2019, 06:04 PM
Last Post: woooee

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020