序文
これまでの10件のブログ投稿では、さまざまな株式グラフィックスと株式予測アルゴリズムの描画について詳しく紹介しましたが、非常に不便な点が1つあります。つまり、特定の株式のデータを表示するたびに、コードを置き換えたり変更したりすると、必然的に余分な時間が無駄になるので、どうすればよいですか?
答えは簡単です。私たちは自分たちで株式市場のソフトウェアを直接開発し、自分たちでデータを取得して自分たちでチェックします。このように、銘柄コードが毎回変更される限り、データを更新して均一に表示することができ、非常に便利です。そして、ビルドインターフェイスブロガーはpyqt5の使用を推奨しています。結局のところ、Qtテクノロジーは最下層で使用されています。現在、デスクトップ開発のパフォーマンスは依然としてQtで最高です。
インターフェースの全体的なフレームワークを構築する
まず、株取引ソフトウェアの全体的なフレームワークを構築する必要があります。コードは次のとおりです。
import sys
import qdarkstyle
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyFrom(QMainWindow):
def __init__(self, parent=None):
super(MyFrom, self).__init__(parent=parent)
self.setWindowTitle('星辰股票行情软件')
self.resize(1100, 100)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
myUI = MyFrom()
myUI.setWindowFlag(Qt.WindowMinimizeButtonHint) # 禁止放大界面
myUI.setFixedSize(myUI.width(), myUI.height()) # 静止拖拽放大界面
myUI.show()
sys.exit(app.exec_())
ここでは、ストックソフトウェアの名前とテーマ、およびソフトウェアインターフェイスのサイズを設定します。、しかし、前の株価チャートによると、単一のインターフェイスでは確かにそれほど多くのグラフィックスに対応できないことは誰もが知っているので、どうすればよいですか?
実際、pyqt5はタブページを提供します。上記のタブを切り替えることで、インターフェイスにジャンプすることなくインターフェイスを完全に切り替えることができます。タブ全体を実装しましょう。
class MyFrom(QMainWindow):
def __init__(self, parent=None):
//...代码在上面
self.init()
def init(self):
self.qTableWidget = QTabWidget()
self.homeTab = QWidget()
self.kTab2 = QWidget()
self.otherTab = QWidget()
self.qTableWidget.addTab(self.homeTab, "主页")
self.qTableWidget.addTab(self.kTab2, "K线图")
self.qTableWidget.addTab(self.otherTab, "龙虎榜")
self.setCentralWidget(self.qTableWidget)
ここでは、QTabWidgetタブを作成し、サブタブの名前を設定し、タブをメインインターフェイスに設定しました。実行後、表示される効果は次の図のようになります。
ホームページのトップ
フレームワーク全体のプロトタイプは、基本的に上記のコードで完成します。次に、これらのサブタブのページに順番に入力する必要があります。
まず、ホームページを実装する必要があります。一般的な株式ソフトウェアには、上海証券取引所、上海証券取引所、深セン証券取引所、Growth Enterprise Marketのインデックス表示、単一株式のトレンドチャートなど、さまざまな大型インデックスがあります。株式の取引詳細など。したがって、ここでは最初にレイアウトモデルについて説明します。ここでは、QGridViewを使用して、インターフェイスをレイアウト用のグリッドに分割します。
class MyFrom(QMainWindow):
def init(self):
//...上面的代码
self.init_hometab()
def init_hometab(self):
self.grid = QGridLayout()
self.grid.setSpacing(5)
ft = QFont()
ft.setPointSize(26)
ft.setBold(True)
self.share_params = [QLabel() for x in range(10)]
self.grid.addWidget(self.share_params[0], 0, 0, 2, 3)
self.share_params[0].setFont(ft)
self.share_params[0].setStyleSheet("color:yellow")
self.grid.addWidget(self.share_params[1], 0, 3, 1, 2)
self.share_params[1].setFont(ft)
self.grid.addWidget(self.share_params[2], 0, 5)
self.grid.addWidget(self.share_params[3], 0, 6)
self.grid.addWidget(self.share_params[4], 0, 7)
self.grid.addWidget(self.share_params[5], 1, 3)
self.grid.addWidget(self.share_params[6], 1, 4)
self.grid.addWidget(self.share_params[7], 1, 5)
self.grid.addWidget(self.share_params[8], 1, 6)
self.grid.addWidget(self.share_params[9], 1, 7)
self.shareThread = ShareThread()
self.shareThread.setValue("sh600690")
self.shareThread._signal.connect(self.shareThread_callbacklog)
self.shareThread.start()
self.qListOne = ['上证指数', '深证成指', '创业板指', '科创50', '上证50', '中证500', '沪深300'] # 添加的数组数据
self.plateThread = plateThread()
self.plateThread._signal.connect(self.plateThread_callbacklog)
self.plateThread.start()
self.homeTab.setLayout(self.grid)
def shareThread_callbacklog(self, shareList):
isloss = float(shareList[5])
i = 0
for share_label, qlist in zip(self.share_params, shareList):
if i == 1:
share_label.setText(str(qlist))
if isloss >= 0:
share_label.setStyleSheet("color:red")
else:zh
share_label.setStyleSheet("color:rgb(0, 255, 0)")
else:
share_label.setText(str(qlist))
i += 1
def plateThread_callbacklog(self, urlList):
i = 0
one_QLabel = [QLabel() for x in range(7)]
two_QLabel = [QLabel() for x in range(7)]
for o_label, t_label, qlist, m_name in zip(one_QLabel, two_QLabel, urlList, self.qListOne):
temp = qlist.split('"')[1].split(',')
isloss = float(str(round(float(temp[2]), 2)))
if isloss >= 0:
o_label.setStyleSheet("color:red;font-size:14px")
t_label.setStyleSheet("color:red;font-size:14px")
else:
o_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")
t_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")
o_label.setText(m_name)
self.grid.addWidget(o_label, 0, 8 + i, 1, 1)
t_label.setText(str(round(float(temp[1]), 2)))
self.grid.addWidget(t_label, 1, 8 + i, 1, 1)
i += 1
インターフェースの要素に関しては、ブロガーはあまり言いません。ここには2つのスレッドがあり、1人のユーザーは株式の基本データを取得し、もう1人のユーザーはセクターのインデックスを取得します。株式データを取得するためのスレッドクラスは次のとおりです。
import time
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import requests
from utils import LYJutils
#股票详细数据获取线程
class ShareThread(QtCore.QThread):
_signal = pyqtSignal(list)
def __init__(self):
super(ShareThread, self).__init__()
def setValue(self, shareNumber):
self.share_num = shareNumber
def run(self):
list = []
while True:
list.clear()
baseUrl = 'http://hq.sinajs.cn/list=' + self.share_num
temp = requests.get(baseUrl).text.split('"')[1].split(',')
list.append(temp[0])# 股票的名称
list.append(round(float(temp[3]), 2))# 当前股票价格
list.append("高 " + str(round(float(temp[4]), 2)))# 当前股票最高价格
list.append("开 " + str(round(float(temp[1]), 2)))# 股票开盘价格
list.append("量比 " + LYJutils.str_of_num(float(temp[8])))# 当前股票量比
list.append(str(round(float(temp[3]) - float(temp[2]), 2))) # 当前股票涨跌幅
m_flo = (float(temp[3]) - float(temp[2])) / float(temp[2]) * 100.0
list.append(str(round(m_flo, 2)) + "%") # 当前股票涨跌幅百分比
list.append("低 " + str(round(float(temp[5]), 2)))# 当前股票最低价格
list.append(temp[30])#交易日期
list.append("金额 " + LYJutils.str_of_num(float(temp[9]))) # 股票成交金额
self._signal.emit(list)
time.sleep(10)
これにより、株式の詳細データリストリストが返され、shareThread_callbacklogコールバック関数を介してQLabelテキストに値が割り当てられます。同時に、これは永続的なループスレッドです。目的は、10秒ごとにリアルタイムのトランザクションデータを取得することです。
次に、プレートスレッドクラスです。
import time
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import requests
#板块指数详细数据线程
class plateThread(QtCore.QThread):
_signal = pyqtSignal(list)
def __init__(self):
super(plateThread, self).__init__()
def run(self):
list = []
qListName = ['s_sh000001', 's_sz399001', 's_sz399006', 's_sh000688', 's_sh000016', 's_sh000905',
's_sh000300', ] # 添加的数组数据
while True:
list.clear()
baseUrl = 'http://hq.sinajs.cn/list='
for index in qListName:
url = baseUrl + index
temp = requests.get(url).text
list.append(temp)
self._signal.emit(list)
time.sleep(10)
セクションスレッドクラスは非常にシンプルで、セクションインデックスを取得するためのワイヤレスループでもあります。結局のところ、ホームページに配置するリアルタイムの株式取引データは、より速く更新したい場合は、変更できます。自分での秒数。
セクターのインデックスを取得するためのインターフェース「http://hq.sinajs.cn/list={blockcode}」に特に注意してください。株式取得インターフェースは「http://hq.sinajs.cn/list= {株式コード}」です。前のブログ投稿と同様に、株式コードの前にszまたはshを追加する必要があります。ただし、セクションコードは独立しているため、上記のセクションコードのルールを自分で確認できます。
実行後の効果は次の図のようになります。
ネットワークストックデータのすべてのリアルタイム取得にはスレッドの作成が必要であることを忘れてしまいました。開発経験のあるプログラマーは、時間のかかるタスクをメインスレッド(つまり、インターフェイス)で実行できないことを知っておく必要があります。そうしないと、フリーズします。