基于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数据类型转换函数总结
Mar 11 Python
改进Django中的表单的简单方法
Jul 17 Python
Python简明入门教程
Aug 04 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
python如何实现反向迭代
Mar 20 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
Python中dict和set的用法讲解
Mar 28 Python
Python2与Python3的区别实例总结
Apr 17 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 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
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
初始Nodejs
2014/11/08 NodeJs
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
对python中raw_input()和input()的用法详解
2018/04/22 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
python字典改变value值方法总结
2019/06/21 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
基于python3的socket聊天编程
2020/02/17 Python
django model object序列化实例
2020/03/13 Python
python PIL模块的基本使用
2020/09/29 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
财务会计应届生求职信
2013/11/24 职场文书
班级口号大全
2014/06/09 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
党员争先创优承诺书
2015/01/20 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫