基于Python实现体育彩票选号器功能代码实例


Posted in Python onSeptember 16, 2020

一,概要

需求: 实现一个GUI界面下的 6+1体育彩票选号器.

(1) 要求界面可以加载系统时间及开奖时间

(2) 功能区完成人选及机选的功能

人选 --> 手动输入6+1位数字.前6位必须在0-9之间的数字.后1位必须是0-4之间的数字

机选 -->

(1) 填写数量(加校验必须为数字且不能为空)点击开始按钮后把选举的数字添加到展示界面中

(2) 允许选举的数字重复及不重复两种选择

(3) 展示区的设置,显示已选的彩票号码

(4) 完成清空展示区内容功能

(5) 完成关闭整个界面窗口功能

二,创建Sportslottery类

要求:通过面向对象的思维完成。GUI界面及功能区分开编写

代码中用到的图片:

easyicon_net_64.ico格式这里不支持上传.所以就不传了.随便网上找个png格式的图片转成.ico格式加载到界面中即可。也可以不加

基于Python实现体育彩票选号器功能代码实例

代码展示:

from tkinter import *
import tkinter.ttk as tk
import datetime
from tkinter.messagebox import *
import tkinter.font as tf
import time
import random
import threading

class Sportslottery(Tk):
  def __init__(self):
    super().__init__()
    self.title("体育彩票选号器")
    self.geometry("800x600+170+80")
    self.resizable(0, 0)
    self.iconbitmap(R"C:\Users\Administrator\PycharmProjects\untitled1\GUI_体育彩票选号器\photo\easyicon_net_64.ico")
    self["bg"] = "lightblue"


    #全局变量
    self.number_list = [] #存储选票号码的每一个值
    self.input_datas_list = [] #存储多次输入的每一组7位数字
    self.number_list01 = [0,1,2,3,4,5,6,7,8,9] #用于允许重复获取数字的列表的前6位
    self.number_list02 = [0,1,2,3,4] #用于允许重复获取数字的列表的第7位
    self.ready = 0 # 启动默认标识符

    #自动加载界面
    self.SetupUI()

  def SetupUI(self):
    #设置Style
    self.style01 = tk.Style()
    self.style01.configure("title.TLabel",foreground = "RoyalBlue")
    self.style01.configure("TPanedwindow", foreground="RoyalBlue")
    self.style01.configure("label02.TLabel", foreground="blue")
    self.style01.configure("label03.TLabel", foreground="red")
    self.style01.configure("label04.TLabel", foreground="blue")
    self.style01.configure("TButton", foreground="black")


    # 加载窗体图片
    self.load_img = PhotoImage(file=R"C:\Users\Administrator\PycharmProjects\untitled1\GUI_体育彩票选号器\photo\beijingtu.png")
    self.label_img = tk.Label(self,image=self.load_img)
    self.label_img.place(x=0,y=0)

    #设置title
    self.label01 = tk.Label(self,text ="6 + 1 体育彩票选号器",style="title.TLabel",font = ("微软雅黑",30,"bold"))
    self.label01.place(x =180,y =20)

    self.labelFrame_query01 = tk.LabelFrame(self,width =380,height = 60)
    self.labelFrame_query01.place(x=0,y=100)

    self.labelFrame_query02 = tk.LabelFrame(self,width =370,height = 60)
    self.labelFrame_query02.place(x=420,y=100)

    self.labelFrame_query03 = tk.LabelFrame(self,text="人选",width =410,height = 60)
    self.labelFrame_query03.place(x=380,y=200)

    self.labelFrame_query04 = tk.LabelFrame(self,text="机选",width =410,height = 260)
    self.labelFrame_query04.place(x=380,y=280)

    #加载系统时间
    def get_week_day(date):
      """
      :param date: 生成中文的星期
      :return:
      """
      week_day_dict = {
        0: '星期一',
        1: '星期二',
        2: '星期三',
        3: '星期四',
        4: '星期五',
        5: '星期六',
        6: '星期天',
      }
      day = date.weekday()
      return week_day_dict[day]
    current_week = get_week_day(datetime.datetime.now())

    #时间格式处理
    date01 = datetime.datetime.today()
    current_day = " %d年%d月%d日 " % (date01.year, date01.month, date01.day)

    #创建加载系统时间的Label标签
    self.label02 = tk.Label(self,text="当前时间: " + current_day + time.strftime('%H:%M:%S', time.localtime(time.time())) + " "+ current_week,font = ("微软雅黑",12,"bold")
                ,style="label02.TLabel")
    self.label02.place(x = 20,y=120)

    def trickit():
      """
      通过time类中的.after(1000,trickit)方法生成动态系统时间
      :return:
      """
      currentTime = "当前时间: " + current_day + time.strftime('%H:%M:%S', time.localtime(time.time())) + " " + current_week
      self.label02.config(text=currentTime)
      self.update()
      self.label02.after(1000, trickit)
    self.label02.after(1000, trickit) #这条必须加,不然时间不会动态显示

    #记载开奖时间(这里没有添加任何功能,只是显示一个开奖时间而已.后续可以单独添加功能)
    date01 = datetime.datetime(2020, 5, 20, 20, 00, 00, 888888)

    #下面的小时分钟秒的部分单纯只是加载date01中的20:00:00而已
    self.label03 = tk.Label(self,text = "开奖时间: " + current_day + date01.strftime("%H:%M:%S"),font = ("微软雅黑",12,"bold")
                ,style="label03.TLabel")
    self.label03.place(x = 460,y = 120)

    self.label04 = tk.Label(self,text = "已选彩票:",font = ("微软雅黑",12,"bold"),style="label04.TLabel")
    self.label04.place(x = 20,y=170)

    self.label05 = tk.Label(self.labelFrame_query04,text = "数量:",font = ("微软雅黑",10,"bold"),style="label04.TLabel")
    self.label05.place(x = 10,y=80)

    self.label06 = tk.Label(self.labelFrame_query04,text = "是否允许重复:",font = ("微软雅黑",10,"bold"),style="label04.TLabel")
    self.label06.place(x = 10,y=140)

    self.repeatable_check = IntVar()
    self.radio_repeatable = tk.Radiobutton(self.labelFrame_query04,text = "允许",variable = self.repeatable_check,value = 0,
                     command = self.draw)
    self.radio_repeatable.place(x = 10,y=170)
    self.radio_non_repeatable = tk.Radiobutton(self.labelFrame_query04,text = "不允许",variable = self.repeatable_check,value = 1,
                     command = self.draw)
    self.radio_non_repeatable.place(x = 70,y=170)

    #人选Entry选框
    self.var_add = StringVar()
    self.entry01 = tk.Entry(self.labelFrame_query03,textvariable=self.var_add,font = ("微软雅黑",12,"bold"))
    self.entry01.place(x = 0,y=0,width=250,height=35)

    #机选Entry选框(默认值设置为0)
    self.var02 = StringVar(value=" 0 ")
    self.entry02 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var02,font = ("微软雅黑",24,"bold"))
    self.entry02.place(x = 2,y=5,width=50,height=50)

    self.var03 = StringVar(value=" 0 ")
    self.entry03 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var03,font = ("微软雅黑",24,"bold"))
    self.entry03.place(x = 60,y=5,width=50,height=50)

    self.var04 = StringVar(value=" 0 ")
    self.entry04 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var04,font = ("微软雅黑",24,"bold"))
    self.entry04.place(x = 118,y=5,width=50,height=50)

    self.var05 = StringVar(value=" 0 ")
    self.entry05 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var05,font = ("微软雅黑",24,"bold"))
    self.entry05.place(x = 176,y=5,width=50,height=50)

    self.var06 = StringVar(value=" 0 ")
    self.entry06 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var06,font = ("微软雅黑",24,"bold"))
    self.entry06.place(x = 234,y=5,width=50,height=50)

    self.var07 = StringVar(value=" 0 ")
    self.entry07 = tk.Entry(self.labelFrame_query04,state = DISABLED,textvariable=self.var07,font = ("微软雅黑",24,"bold"))
    self.entry07.place(x = 292,y=5,width=50,height=50)

    self.var08 = StringVar(value=" 0 ")
    self.entry08 = tk.Entry(self.labelFrame_query04,foreground = "red",state = DISABLED,textvariable=self.var08,font = ("微软雅黑",24,"bold"))
    self.entry08.place(x = 350,y=5,width=50,height=50)

    #填写数量Entry选框
    self.var09 = StringVar()
    self.entry09 = tk.Entry(self.labelFrame_query04,textvariable=self.var09,font = ("微软雅黑",14,"bold"))
    self.entry09.place(x = 50,y=75,width=50)

    self.button01 = tk.Button(self.labelFrame_query03,text = "添 加",command = self.Artificial_addition_number)
    self.button01.place(x = 280,y=5)

    self.button02 = tk.Button(self.labelFrame_query04,text = "开 始",command=self.start)
    self.button02.place(x = 295,y = 170)

    self.button04 = tk.Button(self,text = "清 空",command = self.clear_all)
    self.button04.place(x = 380,y=560)

    self.button05 = tk.Button(self,text = "关 闭",command = self.close_Windows)
    self.button05.place(x = 680,y=560)

    #设置text,scroll bar(效果:已选选票区域如果票数过多整体画面最右侧显示滚动条)
    self.text = Text(self,width=51, height=30)
    self.scroll = Scrollbar(self,width=4,command=self.text.yview)
    self.text.configure(yscrollcommand=self.scroll.set)
    self.scroll.pack(side=RIGHT, fill=Y)
    self.text.place(x=0,y=200)

  def Artificial_addition_number(self):
    """
    人为选号添加方法
    :return:
    """
    #获取输入的值
    self.addition_number = self.var_add.get()

    #对输入的值进行验证
    if not self.addition_number.strip().isdigit():
      showinfo("系统消息","输入的值必须为数字")
      return
    elif len(self.addition_number) != 7:
      showinfo("系统消息","输入必须为【0-9】的7位数字")
      return
    else:
      str_6 = self.addition_number[0:6] #记录输入数字的前6位
      str_last1 = self.addition_number[6] #记录输入数字的最后1位

      #字符串拼接后插入到已选彩票框中
      self.text.insert(1.0, "彩票编号: " + str_6 + "  " + str_last1 + "\n")

      #设置输入到文本中的字体大小
      ft = tf.Font(family='微软雅黑', size=16)

      #通过text.tag_add及text.tag_config方法设置选中下标的字体颜色
      self.text.tag_add('1', '1.0', '1.11', '1.11')
      self.text.tag_config('1', foreground='black',font=ft)
      self.text.tag_add('fag', '1.15', '1.16', '1.15')
      self.text.tag_config('fag', background='yellow', foreground='red',font = ft)

  def clear_all(self):
    """
    清空已选彩票窗体中的所有内容
    :return:
    """
    self.text.delete('1.0', END)

  def close_Windows(self):
    """
    关闭窗体
    :return:
    """
    self.destroy()

  def draw(self):
    """
    机选部分: 1. 输入数字自动滚动生成每一位数字
         2. 对输入的值做验证必须为数字且不能为空
         3. 获取数字分为允许重复和不允许重复
    :return:
    """
    self.numb = self.var09.get() #获取输入的值
    if not self.numb.isdigit() or self.numb == "":
      showinfo("系统消息", "【输入必须为数字且不能为空】")
    else:
      if self.repeatable_check.get() == 0:
        self.repeatable() # 允许重复数字
      else:
        self.non_repeatable() #不允许重复数字

  def repeatable(self):
    """
    生成的数字允许重复
    :return:
    """
    while self.ready <= int(self.numb):
      self.ready += 1
      # 自动选举每个Entry标签的值并把选中的值赋值给entry标签
      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb01 = self.number_list01[index_num]
      self.var02.set(self.numb01)

      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb02 = self.number_list01[index_num]
      self.var03.set(self.numb02)

      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb03 = self.number_list01[index_num]
      self.var04.set(self.numb03)

      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb04 = self.number_list01[index_num]
      self.var05.set(self.numb04)

      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb05 = self.number_list01[index_num]
      self.var06.set(self.numb05)

      index_num = random.randint(1, 1000) % len(self.number_list01)
      self.numb06 = self.number_list01[index_num]
      self.var07.set(self.numb06)

      index_num = random.randint(1, 1000) % len(self.number_list02)
      self.numb07 = self.number_list02[index_num]
      self.var08.set(self.numb07)

      # 字符串拼接到展示区
      self.text.insert(1.0, "彩票编号: " + str(self.numb01) + str(self.numb02) + str(self.numb03) +
               str(self.numb04) + str(self.numb05) + str(self.numb06) + "  " + str(self.numb07) + "\n")
      # 设置输入到文本中的字体大小
      ft = tf.Font(family='微软雅黑', size=16)

      # 通过text.tag_add及text.tag_config方法设置选中下标的字体颜色
      self.text.tag_add('1', '1.0', '1.11', '1.11')
      self.text.tag_config('1', foreground='black', font=ft)
      self.text.tag_add('fag', '1.15', '1.16', '1.15')
      self.text.tag_config('fag', background='yellow', foreground='red', font=ft)

  def non_repeatable(self):
    """
    生成的数字不允许重复
    :return:
    """
    while self.ready <= int(self.numb):
      self.ready += 1
      #自动选取第一到第六位的数字
      seq1 = [i for i in range(0,10)]
      index_num = random.sample(seq1,6) #通过random.sample方法进行选举数字不重复.一次生成6个数字
      time.sleep(0.3) # 停顿0.3秒再获取每个值

      #把生成的list中的值分别赋值给每个entry选框中
      self.var02.set(index_num[0])
      self.var03.set(index_num[1])
      self.var04.set((index_num[2]))
      self.var05.set((index_num[3]))
      self.var06.set((index_num[4]))
      self.var07.set((index_num[5]))

      #自动选举第七位的数字
      seq2 = [i for i in range(0,5)]
      index_num = random.sample(seq2,2)
      self.var08.set(index_num[0])

      #获取7位数字
      self.number01 = self.var02.get()
      self.number02 = self.var03.get()
      self.number03 = self.var04.get()
      self.number04 = self.var05.get()
      self.number05 = self.var06.get()
      self.number06 = self.var07.get()
      self.number07 = self.var08.get()

      # 字符串拼接到展示区
      self.text.insert(1.0, "彩票编号: " + str(self.number01) + str(self.number02) + str(self.number03) +
               str(self.number04) + str(self.number05) + str(self.number06) + "  " + str(self.number07) + "\n")

      # 设置输入到文本中的字体大小
      ft = tf.Font(family='微软雅黑', size=16)

      # 通过text.tag_add及text.tag_config方法设置选中下标的字体颜色
      self.text.tag_add('1', '1.0', '1.11', '1.11')
      self.text.tag_config('1', foreground='black', font=ft)
      self.text.tag_add('fag', '1.15', '1.16', '1.15')
      self.text.tag_config('fag', background='yellow', foreground='red', font=ft)

  def start(self):
    """
    开始按键的设置
    :return:
    """
    self.ready=1
    #此处必须启动新的线程,否则会卡死在开始按钮
    self.thread=threading.Thread(target=self.draw,args=()) #target=跟需要线程执行的方法名.args=()线程执行方法接收的参数,该属性是一个元组
    self.thread.setDaemon(True) #设置守护线程(必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起)
    self.thread.start()

if __name__ == "__main__":
  this_window = Sportslottery()
  this_window.mainloop()

三,缺陷分析

总结:

1. 加载系统时间没有完全模块化 (对于面向对象的开发这里不足-----希望哪位大神看到此文,可以帮忙完成这里的面向对象部分)

2. 开奖时间这里是被写死到晚上八点的.但是个人并没有添加开奖功能(感兴趣的小伙伴可以开发这块的功能实现真正开奖后显示中奖号码)

3. 不允许重复的地方第一次点击,会不用点击开始按钮就自动生成指定数量的票号(本人一时没有想到好的解决办法,希望大神们帮忙解决)

4. 最后执行界面没有独立模块化(个人比较懒因此没有另外创建类把这部分放进去)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python绘制数据的瀑布图的教程
Apr 07 Python
python线程、进程和协程详解
Jul 19 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
python使用turtle绘制分形树
Jun 22 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
Python实现京东秒杀功能代码
May 16 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
基于Python测试程序是否有错误
May 16 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python面向对象特殊属性及方法解析
Sep 16 #Python
通过代码实例了解Python异常本质
Sep 16 #Python
Python使用xpath实现图片爬取
Sep 16 #Python
Python自动创建Excel并获取内容
Sep 16 #Python
python如何实时获取tcpdump输出
Sep 16 #Python
基于python实现复制文件并重命名
Sep 16 #Python
详解python程序中的多任务
Sep 16 #Python
You might like
PHP 学习路线与时间表
2010/02/21 PHP
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
php中的strpos使用示例
2014/02/27 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
Python中关键字is与==的区别简述
2014/07/31 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python如何生成树形图案
2018/01/03 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
基于python3实现倒叙字符串
2020/02/18 Python
详解Python高阶函数
2020/08/15 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
运动会四百米广播稿
2014/01/19 职场文书
学校门卫管理制度
2014/01/30 职场文书
班主任工作经验材料
2014/02/02 职场文书
社区交通安全实施方案
2014/03/22 职场文书
大足石刻导游词
2015/02/02 职场文书
2016年小学生寒假总结
2015/10/10 职场文书