要求:编写一个有 GUI 界面的程序,该程序输入职工工号和完成的产品数量,程序允许同一职
工有多次输入,由程序对其完成的产品数量实现累计.程序按完成数量对他们排序,并确定他
们的名次.按完成的产品数量由多到少的顺序,输出名次、数量,同一名次的职工人数及他们的工号。
代码段
from tkinter import *
#创建窗口
root = Tk()
root.title("测试")
u = StringVar()
p = StringVar()
frame = Frame(root)
#窗口大小
frame.pack(padx=80, pady=80, ipadx=40)
#id列表
link = []
#作业数量列表
link_num = []
# 输入框建立
def lab():
lab1 = Label(frame, text="工号:")
lab1.grid(row=0, column=0, padx=5, pady=5, sticky=W)
lab2 = Label(frame, text="数量:")
lab2.grid(row=1, column=0, padx=5, pady=5, sticky=W)
ent1 = Entry(frame, textvariable=u)
ent1.grid(row=0, column=1, sticky='ew', columnspan=2)
ent2 = Entry(frame, textvariable=p)
ent2.grid(row=1, column=1, sticky='ew', columnspan=2)
# 按钮创建
def bott():
button = Button(frame, text="添加", command=submit, default='active')
button.grid(row=2, column=1)
lab3 = Label(frame, text="")
lab3.grid(row=2, column=0, sticky=W)
button2 = Button(frame, text="查询", command=submit1, default='active')
button2.grid(row=2, column=2, padx=5, pady=5)
button3 = Button(frame, text="退出", command=quit)
button3.grid(row=4, column=4, padx=5, pady=5)
# 添加数据
def a(id, link, link_num, num):
flag = -1
for i in link:
if i == id:
flag = link.index(i)
if flag != -1:
link_num[flag] = link_num[flag] + num
elif flag == -1:
link.append(id)
link_num.append(num)
# 计算数量相同的人数
def a_sort(link, link_num):
count = []
num = 0
for i in range(len(link)):
for x in link_num:
if link_num[i] == x:
num = num + 1
count.append(num)
num = 0
#返回每个员工作业数量与其他人相同的次数
return count
# 排序
def b_sort(link, link_num):
#合并两个序列
arr = list(zip(link_num, link))
#降序排列
arr.sort(key=lambda x: x[0],reverse=True)
print(arr)
#拆散合并序列
l1, l2 = zip(*arr)
print(link, link_num)
#排序后的两个列表
return l2, l1
def submit():
#获取gui界面id
id = u.get()
if id == '':
print("error")
else:
#获取gui界面num并强制转换为int类型
num = int(p.get())
#将其分别加入两个列表
a(id, link, link_num, num)
print(id," ",num)
#将两个输入框设置为“ ”达到清除上次输入内容
p.set("")
u.set("")
# 排序结果
def sub(link, link_num):
#得到相同人数列表
count1 = a_sort(link, link_num)
#验证
print(count1)
#将其合并然后按数量排序
arr = list(zip(link_num, count1, link))
link_nums = list(dict.fromkeys(arr))
link_nums.sort(key=lambda x: x[0],reverse=True)
#拆开序列
c, d, e = zip(*link_nums)
news_id = []
#将其数量相同的id放在一起
for nums in c:
new_id = ''
print(nums)
for i in range(len(link_num)):
if link_num[i] == nums:
new_id = new_id + link[i] + ' '
news_id.append(new_id)
# print(news_id)
#返回数量,人数,相同数量id
return c, d, news_id
# 将结果显示到Gui上
def submit1():
#创建查询结果窗口
root1 = Tk()
root1.title("查询结果")
frame1 = Frame(root1)
frame1.pack(padx=80, pady=160, ipadx=40)
#将表的属性写入窗口
Label(frame1, text='名次 数量 职工人数 工号', bg='yellow').pack()
# listb = root1.Text(frame1)
# listb.place(x=2, y=2, width=800, height=800)
# listb.insert()
result = []
#再次排序
l11, l21 = b_sort(link, link_num)
print(link, link_num)
#得到三个数据列表
ss1, ss2, ss3 = sub(l11, l21)
arr1s = list(zip(ss1, ss2, ss3))
#按ss1降序排列
arr1s.sort(key=lambda x: x[0],reverse=True)
#去除重复项
results = list(dict.fromkeys(arr1s))
s1, s2, s3 = zip(*results)
#控制台打印最终结果并加入名次项
for i in range(len(s1)):
print(s1, s2, s3)
text = str(i + 1) + ' ' + str(s1[i]) + ' ' + str(s2[i]) + " " + s3[i]
result.append(text)
#gui界面打印结果
for item in result:
Label(frame1, fg="red",text=item,anchor=W).pack()
root1.mainloop()
#调用函数创建按钮和窗口达到gui界面操作
lab()
bott()
root.mainloop()
在测试窗口
分别输入了如下数据:
点击查询便得到如下运行结果: