基于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使用random和tertools模块解一些经典概率问题
Jan 28 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
python下载文件记录黑名单的实现代码
Oct 24 Python
Anaconda入门使用总结
Apr 05 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python程序控制NAO机器人行走
Apr 29 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
浅析Python requests 模块
Oct 09 Python
python 利用toapi库自动生成api
Oct 19 Python
python中pyplot基础图标函数整理
Nov 10 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
node.js中的http.request方法使用说明
2014/12/14 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
销售人员个人求职信
2013/09/26 职场文书
班会关于环保演讲稿
2013/12/29 职场文书
建材投资建议书
2014/05/16 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
避暑山庄导游词
2015/02/04 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
2015年环保局工作总结
2015/05/22 职场文书