菜鳥學Python之寫抽獎Demo

記得以前上大學時學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])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章