2020-08-06

95 篇文章 2 订阅

窗体程序修改(续)

参见:窗体程序修改
程序已基本达到预期,唯一感到遗憾的是如果有延迟效果就更好,可惜我尚未找到方法,还请多指教。
修改说明:
1、对窗体和控件的背景、颜色、字体进行了修订。
2、对人工选增加了及时判断和临时排序。
3、对程序存在的一些瑕疵进行了剔除。
4、关于数字输入,每一个数字都必须是2位,不足的补0。如果输入的数字一开始就存在错误,例如第一位输入5,肯定是错误的,马上将其清除,就好像没有输入一样。
5、这是采用if-else最多的一次,我自己都差点晕了,看哪位网友找找问题。

import random
import tkinter as tk
from tkinter import *
import tkinter.messagebox as msg

mark = -1
marks = [6, 13, 20, 27, 34]
cb_list = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '0', '退格']

# 初始化Tk()
myWindow = Tk()
# 设置标题
myWindow.title('大乐透生成器')
# 设置窗口大小
myWindow.geometry('800x600')
myWindow.resizable(0, 0)
# 没有框架布局会乱,设置多个框架
frame = [Frame() for i in range(11)]
for i in range(11):
    frame[i] = Frame(myWindow)
    frame[i].pack()


# 随机生成一注大乐透
def c_rand():
    front = random.sample(range(1, 36), 5)  # 从前区列表中随机选5个不同的数
    back = random.sample(range(1, 13), 2)  # 从后区列表中随机选2个不同的数
    front.sort(), back.sort()
    one = front + back
    for k in range(7):
        one[k] = '0' + str(one[k]) if len(str(one[k])) == 1 else str(one[k])
    return one


# 全部清除
def clear5():
    global mark
    for _i in range(35):
        var[_i].set('')
    mark = -1


# 按下后清除显示区最新输入的一行
def clear1():
    global mark
    if mark in [-1, 6, 13, 20, 27]:
        if var[mark + 1].get() != '':
            var[mark + 1].set('')
            return
    for _i in range(5):
        if _i * 7 <= mark <= _i * 7 + 6:
            for _j in range(7):
                var[_i * 7 + _j].set('')
            mark = _i * 7 - 1
            break


# 按下后触发机选1注
def press1():
    global mark
    if mark in [-1, 6, 13, 20, 27] and var[mark + 1].get() == '':
        arr = c_rand()
        for _i in range(7):
            var[mark + 1 + _i].set(arr[_i])
        mark += 7
    else:
        msg.showinfo('请按清除按钮')


# 按下后触发机选5注
def press5():
    global mark
    if mark == -1 and var[0].get() == '':
        for _i in range(5):
            arr = c_rand()
            for _j in range(7):
                var[_i * 7 + _j].set(arr[_j])
            mark = 34
    else:
        msg.showinfo('请按清除按钮')


# 按下0-9及退格按钮触发事件
def click(names):
    global mark
    if names == '退格':
        if mark == -1:
            var[0].set('')
        elif mark == 34:
            var[mark].set('')
            mark -= 1
        else:
            if var[mark + 1].get() == '':
                var[mark].set('')
                mark -= 1
            else:
                var[mark + 1].set('')

    else:  # 按下数字键,在显示区数字未填满的情况下生效
        if mark < 34:
            var[mark + 1].set(var[mark + 1].get() + names)
            kk = var[mark + 1].get()
            
            if len(kk) == 1:
                if (mark + 1) % 7 < 5:
                    if kk > '3':
                        var[mark + 1].set('')
                else:
                    if kk > '1':
                        var[mark + 1].set('')
                return
            if len(kk) == 2:
                if (mark + 1) % 7 < 5:
                    handle_front(kk)
                else:
                    handle_back(kk)


# 处理前区数字
def handle_front(s):
    global mark
    if s > '35' or s == '00':
        var[mark + 1].set('')
        return
    k = (mark + 1) % 7
    if k == 0:
        mark += 1
    elif 0 < k < 5:
        temp = [var[mark - _i].get() for _i in range(k)]
        if s in temp:
            var[mark + 1].set('')
        else:
            temp.append(s)
            temp.sort()
            for _i in range(k + 1):
                var[mark - k + 1 + _i].set(temp[_i])
            mark += 1


# 处理后区数字
def handle_back(s):
    global mark
    if s > '12' or s == '00':
        var[mark + 1].set('')
        return
    if (mark + 1) % 7 == 5:    # 处理后区第一位
        mark += 1
    else:   # 处理后区第二位
        if s == var[mark].get():
            var[mark + 1].set('')
        else:
            mark += 1
            if s < var[mark-1].get():
                var[mark].set(var[mark-1].get())
                var[mark-1].set(s)


# 文字布局
L1 = Label(frame[0], fg="purple", font=('Arial', 15), bg='grey', text="显示区域", width=10, height=2).grid(row=0,
                                                                                                       column=0)
L2 = Label(frame[2], fg="purple", font=('Arial', 15), bg='grey', text="按键区域", width=10, height=2).grid(row=0,
                                                                                                       column=0)
# 标签布局
var = [tk.StringVar() for _ in range(35)]  # 如需标签内容变化,设置var值,与'textvariable'属性对应
colour = ['red', 'red', 'red', 'red', 'red', 'blue', 'blue']
bg = ['#C0C0C0', '#C0C0C0', '#C0C0C0', '#C0C0C0', '#C0C0C0', '#808080', '#808080']
for i in range(5):
    for j in range(7):
        L = Label(frame[1], fg=colour[(i * 7 + j) % 7], font=('Arial', 12), bg=bg[(i * 7 + j) % 7],
                  textvariable=var[i * 7 + j], width=7, height=2, relief=RAISED).grid(row=i, column=j)
# 按键布局
for ind, name in enumerate(cb_list):
    tk.Button(frame[3 + ind // 3], font=('Arial', 12), bg='#90EE90', width=7, height=2, text=name,
              command=lambda arg=name: click(arg)).grid(row=ind // 3, column=ind)
B1 = Button(frame[7], font=('Arial', 12), bg='#90EE90', text="机选1", width=7, height=2, relief=RAISED,
            command=press1).grid(row=0, column=0)
B2 = Button(frame[7], font=('Arial', 12), bg='#90EE90', text="机选5", width=7, height=2, relief=RAISED,
            command=press5).grid(row=0, column=1)
B3 = Button(frame[7], font=('Arial', 12), bg='#90EE90', text="清除1", width=7, height=2, relief=RAISED,
            command=clear1).grid(row=0, column=2)
B4 = Button(frame[7], font=('Arial', 12), bg='#90EE90', text="清除5", width=7, height=2, relief=RAISED,
            command=clear5).grid(row=0, column=3)
# 设置窗体背景
myWindow["background"] = "grey"
# 投屏
myWindow.mainloop()

窗体图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值