記得以前上大學時學C++的期末大作業, 也是寫了個MFC的36選6的抽獎程序自娛自樂, 這次看着支付寶裏的收益週週樂, 也想搞個程序來預測下結果. 本來是想用支付寶小程序寫的, 不過沒那麼多時間玩他的IDE, 只能用摸魚時間在VsCode裏寫寫Python實現了(主要是佈局頁面弄的好麻煩,沒樣式又不好看,調試還慢).
先上成果運行貼圖:
代碼分成兩個文件, 一個主要是使用tkinter 的窗體佈局, 熟悉輸入輸出和按鈕事件響應, 另一個是讀寫sqlite以及抽獎邏輯,熟悉數據庫操作和集合數據類型的運用.
數據表:
CREATE TABLE "tb_gaming_result" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"release_time" INTEGER,
"game_result" INTEGER
)
上代碼:
#gaming.py 主入口
from tkinter import *
import tkinter.messagebox
from gamingsql import *
class GamingDialog():
# 類構造函數, 初始化數據庫連接
def __init__(self, tk):
self.dialog = tk
self.sqlOper = GamingSql('./gaming.db3')
#對話框窗體佈局
def initiate_dialog(self):
self.dialog.title("收益週週樂")
self.topFrame = Frame(self.dialog, height=20, width=320)
self.topFrame.grid(row=0, column=0, columnspan=8)
self.btnPredict = Button(
self.dialog, text="馬上預測", command=self.predictText)
self.btnPredict.grid(row=1, column=1)
self.lbPedict = Label(self.dialog, text=":")
self.lbPedict.grid(row=1, column=2)
self.predictText1 = StringVar()
self.predictText1.set("0")
self.predictText2 = StringVar()
self.predictText2.set("0")
self.predictText3 = StringVar()
self.predictText3.set("0")
self.predictText4 = StringVar()
self.predictText4.set("0")
self.lbPedictContent1 = Label(
self.dialog, textvariable=self.predictText1, bd=2, relief="solid")
self.lbPedictContent1.grid(row=1, column=3)
self.lbPedictContent2 = Label(
self.dialog, textvariable=self.predictText2, bd=2, relief="solid")
self.lbPedictContent2.grid(row=1, column=4)
self.lbPedictContent3 = Label(
self.dialog, textvariable=self.predictText3, bd=2, relief="solid")
self.lbPedictContent3.grid(row=1, column=5)
self.lbPedictContent4 = Label(
self.dialog, textvariable=self.predictText4, bd=2, relief="solid")
self.lbPedictContent4.grid(row=1, column=6)
self.middleFrame = Frame(self.dialog, height=20, width=320)
self.middleFrame.grid(row=2, column=0, columnspan=8)
self.lbFrame = LabelFrame(self.dialog, text="上期開獎結果")
self.lbFrame.grid(row=3, column=0, columnspan=8)
self.lbGameDay = Label(self.lbFrame, text="開獎日")
self.lbGameDay.grid(row=0, column=1)
self.lbGameResult = Label(self.lbFrame, text="結果")
self.lbGameResult.grid(row=0, column=3)
self.tbGameDay = Entry(self.lbFrame)
self.tbGameDay.grid(row=1, column=1)
self.tbGameResult = Entry(self.lbFrame)
self.tbGameResult.grid(row=1, column=3)
self.lbbFrame = Frame(self.lbFrame, height=20, width=320)
self.lbbFrame.grid(row=2, column=0, columnspan=6)
self.btnResult = Button(self.lbFrame, text="保存",
command=self.addResult)
self.btnResult.grid(row=3, column=0, columnspan=6)
self.bottomFrame = Frame(self.dialog, height=20, width=320)
self.bottomFrame.grid(row=4, column=0, columnspan=8)
# 馬上預測按鈕事件
def predictText(self):
predict = self.sqlOper.GetPredict()
self.predictText1.set(predict[0])
self.predictText2.set(predict[1])
self.predictText3.set(predict[2])
self.predictText4.set(predict[3])
# 保存按鈕事件
def addResult(self):
self.sqlOper.NewGameResult(
self.tbGameDay.get(), self.tbGameResult.get())
tkinter.messagebox.showinfo("記錄保存", "添加成功")
#主入口
if __name__ == '__main__':
top = Tk()
gaming = GamingDialog(top)
# 設置根窗口默認屬性
gaming.initiate_dialog()
# 進入消息循環
top.mainloop()
#gamingsql.py 負責將開獎結果保存進數據庫, 以及查出歷史開獎結果進行預測.
import sqlite3
import random
import time
class GamingSql():
def __init__(self, dbFile):
self.dbFile = dbFile
def connect(self):
self.con = sqlite3.connect(self.dbFile)
self.dbCursor = self.con.cursor()
# 分頁查詢歷史中獎結果
def GetAllResult(self, pageNo, pageRow):
self.connect()
sql = "select release_time,game_result from tb_gaming_result order by release_time desc"
if pageRow > 0:
sql = sql + " limit %d,%d " % (pageNo*pageRow, pageRow)
dbResults = self.dbCursor.execute(sql)
allDatas = dbResults.fetchall()
self.dbCursor.close()
self.con.close()
return allDatas
# 新增或更新開獎記錄
def NewGameResult(self, rtime, gresult):
self.connect()
sql = "select id from tb_gaming_result where release_time=:rtime "
dbResults = self.dbCursor.execute(sql, {'rtime': rtime})
aid = dbResults.fetchone()
if aid is None:
sql = ' insert into tb_gaming_result(release_time, game_result) values (:rtime, :gresult)'
self.dbCursor.execute(sql, {'rtime': rtime, 'gresult': gresult})
self.con.commit()
else:
sql = ' update tb_gaming_result set game_result=:gresult where release_time=:rtime'
self.dbCursor.execute(sql, {'rtime': rtime, 'gresult': gresult})
self.con.commit()
self.dbCursor.close()
self.con.close()
#獲取總記錄數量
def GetTotalResult(self):
self.connect()
sql = "select count(1) as total from tb_gaming_result "
dbResults = self.dbCursor.execute(sql)
allDatas = dbResults.fetchone()
total = 0
if allDatas is not None:
total = allDatas[0]
self.dbCursor.close()
self.con.close()
return total
#概率預測
def GetPredict(self):
totalCount = self.GetTotalResult()
gamecount = totalCount + 1
t = []
for x in range(4):
u = []
for y in range(10):
u.append(gamecount)
t.append(u)
n = 0
pageno = 0
while n < totalCount:
pageResult = self.GetAllResult(pageno, 20)
if pageResult is not None:
arrLen = len(pageResult)
for x in range(arrLen):
gr = str('%04d' % pageResult[x][1])
for y in range(4):
t[y][int(gr[y])] -= 1
n = n + 20
pageno = pageno+1
gameResult = ''
for x in range(4):
kr = []
for y in range(10):
for z in range(t[x][y]):
kr.append(y)
krlen = len(kr)
gameResult = gameResult+self.randomGameble(kr, krlen)
return gameResult
#單位數隨機抽取
def randomGameble(self, alist, alen):
ranlist = random.sample(alist, alen)
time.sleep(random.randrange(10, 500)/1000)
gindex = random.randrange(alen)
return str(ranlist[gindex])