窗体程序修改(续)
参见:窗体程序修改
程序已基本达到预期,唯一感到遗憾的是如果有延迟效果就更好,可惜我尚未找到方法,还请多指教。
修改说明:
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()