【Python开发利器-TKinterDesigner 】 :实例精讲:使用TKinterDesigner开发股票监控报警器
TKinterDesigner QQ群:100180960
本节视频教程如下:https://www.bilibili.com/video/BV1LV411r7uc/
大家好,度过了一个无聊的周末,想毕很多朋友在等着周一的A股开盘吧,上周的连续调整,使很多人的账户利润大幅缩水,甚至亏钱,这可如何是好?
我思钱想去,终于明白,人的情绪在A股走势面前,不过就是一坨屎,只有强大的AI,科学分析,才能战胜恐惧和贪婪,到达利润的彼岸。
哈哈哈,言归正传,这一节,我教大家使用TKinterDesigner来开发一个股票监控器,帮助你锁定心中牛股,工作时做到“手中有股,心中无股!”。
好,在开始之前,我们先准备一下今天的食材:
打开:https://github.com/honghaier-game/TKinterDesigner, 下载V1.3.5。
然后,洗干净手,打开TKinterDesigner,创建一个新的空工程。
然后我们来设计一下产品的功能:
我们希望能有一个监控的股票池,将输入的股票代码,最高和最低限价设置好放入股票监控池。启动监控后,每秒进行刷新,如果股价超过最高限价或最低限价后,会向我们的手机号发送短信通知。
好的,在主窗体中,从控件面板拖拽Label,Button,Entry,TreeView,并修改文本和数据数据,设计好的界面如下:
然后,我们需要为股票池对应的视图控件TreeView增加一个绑定变量:StockArray数组。用来存放股票池中的股票信息(股票代码,最高和最低限价)。好的,这样界面就做好了。
我们现在新建一个Python文件,定名为StockMonitor.py,然后我们在这里对所需要主要功能进行封装。
一。股票信息获取:我们在这里使用到tushare这个财经库,通过pip install tushare可以安装一下,然后我们就可以调用其中的get_realtime_quotes接口对股票进行实时监控了。
def getStockInfo(stock_code):
df = ts.get_realtime_quotes(stock_code)
# e = df[['code','name','time','price']]
c = df[u'code']
n = df[u'name']
t = df[u'time']
p = df[u'price']
text = c[0] + " " + n[0] + " " + t[0] + " " + p[0]
print(text)
return df
二。发送短信服务:我们在这里使用到twilio这个国外的短信发送服务,注册后,获取一个免费的试用手机号,然后将我们的手机号进行绑定验证,通过后就可以得到账户的SID和一个TOKEN,在 twilio的官网上,详细的针对各种开发语言做了使用说明,建议大家通过访问 https://www.twilio.com/ 进行尝试。
account_sid = ""#改成申请的SID
auth_token = ""#改成申请的TOKEN
client = Client(account_sid, auth_token)
smsText = "Stock:600050 Price 5.55"
#from_改成得到的试用手机号
#to改成接手消息的手机号,但要记得+86哦
client.messages.create(to="+8613488888888",from_="+13343784863",body=smsText)
这两个功能,在网上都有很多介绍,在这里就不一一详解了。有了这两个重要的功能库辅助,其实开发这个监控很简单了。
下面是我们自定类StockMonitor.py的代码:
import os
import time
import tushare as ts
import pandas as pd
import threading
from twilio.rest import Client
threadactive = True
def getStockInfo(stock_code):
df = ts.get_realtime_quotes(stock_code)
# e = df[['code','name','time','price']]
c = df[u'code']
n = df[u'name']
t = df[u'time']
p = df[u'price']
text = c[0] + " " + n[0] + " " + t[0] + " " + p[0]
print(text)
return df
class StockMonitor:
def __init__(self):
self.StockArray = []
self.TreeView = None
self.PhoneNumber = None
self.Run_Function = None
def addStock(self,StockCode,MaxPrice,MinPrice):
self.StockArray.append([StockCode,MaxPrice,MinPrice,False,False])
def SetMonitorInfo(self,TreeView,PhoneNumber):
self.TreeView = TreeView
self.PhoneNumber = PhoneNumber
def StartMonitoring(self):
account_sid = ""#改成申请的SID
auth_token = ""#改成申请的TOKEN
client = Client(account_sid, auth_token)
all_items = self.TreeView.get_children()
for item in all_items:
self.TreeView.delete(item)
for stock_code in self.StockArray:
df = ts.get_realtime_quotes(stock_code[0])
e = df[['code','name','price','time']]
c = df[u'code']
n = df[u'name']
p = df[u'price']
t = df[u'time']
print(e)
if float(p[0]) > float(stock_code[2]) :
self.TreeView.insert('','end',values=(c[0],n[0],t[0],p[0],stock_code[2],stock_code[1],"超过上限"))
if stock_code[3] == False:
# smsText = "您的股票"+n[0]+"("+c[0]+") 已超过设定上限价格"+ stock_code[2] + ",当前价格"+p[0]+",请及时关注!"
smsText = "Stock:"+"("+c[0]+") Price:"+p[0]
#from_改成得到的试用手机号
client.messages.create(to=self.PhoneNumber,from_="+13343784863",body=smsText)
stock_code[3] = True
elif float(p[0]) < float(stock_code[1]):
self.TreeView.insert('','end',values=(c[0],n[0],t[0],p[0],stock_code[2],stock_code[1],"低于下限"))
if stock_code[4] == False:
# smsText = "您的股票"+n[0]+"("+c[0]+") 已低于设定下限价格"+ stock_code[1] + ",当前价格"+p[0]+",请及时关注!"
smsText = "Stock:"+"("+c[0]+") Price:"+p[0]
print(smsText)
#from_改成得到的试用手机号
client.messages.create(to=self.PhoneNumber,from_="+13343784863",body=smsText)
stock_code[4] = True
else:
self.TreeView.insert('','end',values=(c[0],n[0],t[0],p[0],stock_code[1],stock_code[2],"平稳波动"))
self.Run_Function = self.TreeView.after(1000, self.StartMonitoring)
def StopMonitoring(self):
self.TreeView.after_cancel(self.Run_Function)
self.StockArray = []
我们在这个类里,通过addStock将股票信息加入到监控池中,在SetMonitorInfo里专入股票池对应的TreeView和警报接收的手机号。
当我们在界面上按下启动监控按钮时,则调用StartMonitoring,并同时将按钮文字改为“停止监控”,再次按下后,则停止监控并恢复文字为“启动监控”。
有了这个类代码,我们回到TKinterDesigner。我们在“增加股票”按钮上右键,弹出“事件响应”,然后为"Command"增加函数代码:
def Button_4_onCommand(className,widgetName):
StockCode = Fun.GetUIText(className,"Entry_3")
StockInfo = StockMonitor.getStockInfo(StockCode)
StockCode = StockInfo[u'code']
StockName = StockInfo[u'name']
StockTime = StockInfo[u'time']
StockPrice = StockInfo[u'price']
MaxPrice = Fun.GetUIText(className,"Entry_10")
MinPrice =Fun.GetUIText(className,"Entry_12")
TreeView13 = Fun.GetUIEle(className,"TreeView_13")
TreeView13 .insert('','end',values=(StockCode[0],StockName[0],StockTime[0],StockPrice[0],MinPrice,MaxPrice))
StockArray = Fun.GetUIData(className,"TreeView_13","StockArray")
StockArray.append([StockCode[0],MaxPrice,MinPrice])
这个函数,主要就是将填写的股票信息显示到TreeView中以及放入它的绑定数组变量。这里需要import StockMonitor哦。
用样方式为“启动监控”按钮编写代码,对StockMonitor中的类实例化,并调用StartMonitoring函数进行监控。
StockMonitorInst = None
def Button_6_onCommand(className,widgetName):
global StockMonitorInst
BtnText = Fun.GetUIText(className,widgetName)
if BtnText == "启动监控":
if StockMonitorInst == None:
StockMonitorInst = StockMonitor.StockMonitor()
StockArray = Fun.GetUIData(className,"TreeView_13","StockArray")
for stockcode in StockArray:
StockMonitorInst.addStock(stockcode[0],stockcode[1],stockcode[2])
TreeView = Fun.GetUIEle(className,"TreeView_13")
PhoneNumber=Fun.GetUIText(className,"Entry_17")
StockMonitorInst.SetMonitorInfo(TreeView,PhoneNumber)
StockMonitorInst.StartMonitoring()
Fun.SetUIText(className,widgetName,"停止监控")
else:
StockMonitorInst.StopMonitoring()
Fun.SetUIText(className,widgetName,"启动监控")
如果不需要监控时,再次点击按钮即可。