简介
该程序为自主学习所做,主要功能如下:
增添个人信息(主要展现为姓名)。
查询所添加的姓名信息。
生成随机序列
原理讲解:
首先通过tkinter创建GUI界面
将各个功能封装成类
将输入的文本(姓名)信息转化为array数组,然后将其append到一个数组中
通过读取数组中的元素实现查看所有录入的信息
判断已知数组的长度,然后生成等长的不重复的随机数数组
然后通过随机数组对保存有信息的数组进行索引生成行的数组即随机排序结果
所有结果的显示均通过tabulate的grid形式输出以保证整体的美观
代码实现
引用相应的包
import numpy as np
from tabulate import tabulate
import random
from tkinter import *
import os
GUI界面
# 设置窗口
def set_init_window(self):
self.init_window_name.title("随机排序") # 窗口名
self.init_window_name.geometry('500x550+380+100') # 290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置
# #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887 self.init_window_name.attributes("-alpha",
# 0.9) #虚化,值越小虚化程度越高 标签
self.init_data_label1 = Label(self.init_window_name, text="姓 名:", font=('Arial', 15), width=10)
self.init_data_label1.place(x=75, y=50, anchor='nw')
# 文本框
self.init_data_Text = Text(self.init_window_name, width=20, height=1, bg="white", fg="black", font=("宋体", 14),
bd='0') # 原始数据录入框
self.init_data_Text.place(x=190, y=50, anchor='nw')
self.init_data_Text1 = Text(self.init_window_name, width=450, height=300, bg="white",
fg="black", font=("宋体", 14),
bd='0') # 结果输出框
self.init_data_Text1.place(x="25", y="200", width="450", height="300")
# 按钮
self.str_trans_to_md5_button = Button(self.init_window_name, text="添加", bg="lightblue", width=10,
font=('黑体', 12), command=self.add_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=40, y=120, anchor='nw')
self.str_trans_to_md5_button = Button(self.init_window_name, text="查询", bg="lightblue", width=10,
font=('黑体', 12), command=self.show_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=200, y=120, anchor='nw')
self.str_trans_to_md5_button = Button(self.init_window_name, text="生成", bg="lightblue", width=10,
font=('黑体', 12), command=self.split_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=360, y=120, anchor='nw')
self.init_data_label2 = Label(self.init_window_name, text="@Author:", font=('宋体', 13), width=10)
self.init_data_label2.place(x=120, y=160, anchor='nw')
self.init_data_label3 = Label(self.init_window_name, text="聪明的波波", font=('宋体', 13), width=10)
self.init_data_label3.place(x=250, y=160, anchor='nw')
path = StringVar()
path.set(os.path.abspath(".."))
设置界面函数
def gui_start():
init_window = Tk() # 实例化出一个父窗口
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗口默认属性
ZMJ_PORTAL.set_init_window()
init_window.mainloop() # 父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示
功能函数
增加
def add_date(self):
src = self.init_data_Text.get(1.0, END)
if len(src) <= 1:
self.init_data_Text.delete(1.0, END)
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "请不要输入空白信息!!!")
else:
src = np.array(src)
a.append(src)
self.init_data_Text.delete(1.0, END)
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "添加成功")
查看所添加内容
def show_date(self):
self.init_data_Text1.delete(1.0, END)
if len(a) < 1:
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "暂无内容,请先添加有效信息!")
else:
c = []
b = a
b = np.array(b)
b = b.reshape(-1, 1)
b = b[:, 0]
tmp = np.arange(len(a))
c.append(tmp)
c = np.array(c)
b = b[c]
b = b.T
title = ['序号', '姓名']
self.init_data_Text1.insert(1.0, tabulate(b, headers=title,
tablefmt='grid', showindex=np.arange(1, len(a)+1)))
生成随机序列
def split_date(self):
self.init_data_Text1.delete(1.0, END)
if len(a) < 1:
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "暂无内容,无法生成!")
else:
self.init_data_Text1.delete(1.0, END)
c = []
b = a
b = np.array(b)
b = b.reshape(-1, 1)
b = b[:, 0]
tmp = random.sample(range(len(a)), len(a))
c.append(tmp)
c = np.array(c)
title = ['序号', '名称']
result = b[c]
result = result.T
self.init_data_Text1.insert(1.0, tabulate(result, headers=title, tablefmt='grid',
showindex=np.arange(1, len(a) + 1)))
生成等长且不重复的随机序列
random.sample(range(len(#所设置的数组)), len(#所设置的数组))
效果图
![](https://img-blog.csdnimg.cn/img_convert/f5a6a0c4dad18afeb859c628438e8c56.png)
完整代码
import numpy as np
from tabulate import tabulate
import random
from tkinter import *
import os
LOG_LINE_NUM = 0
a = []
# 界面化
class MY_GUI:
def __init__(self, init_window_name):
self.init_data_label2 = None
self.init_data_label3 = None
self.init_data_Text1 = None
self.init_data_label1 = None
self.str_trans_to_md5_button = None
self.log_data_Text = None
self.result_data_Text = None
self.log_label = None
self.result_data_label = None
self.init_data_label = None
self.init_data_Text = None
self.init_window_name = init_window_name
# 设置窗口
def set_init_window(self):
self.init_window_name.title("随机排序") # 窗口名
self.init_window_name.geometry('500x550+380+100') # 290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置
# #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887 self.init_window_name.attributes("-alpha",
# 0.9) #虚化,值越小虚化程度越高 标签
self.init_data_label1 = Label(self.init_window_name, text="姓 名:", font=('Arial', 15), width=10)
self.init_data_label1.place(x=75, y=50, anchor='nw')
# 文本框
self.init_data_Text = Text(self.init_window_name, width=20, height=1, bg="white", fg="black", font=("宋体", 14),
bd='0') # 原始数据录入框
self.init_data_Text.place(x=190, y=50, anchor='nw')
self.init_data_Text1 = Text(self.init_window_name, width=450, height=300, bg="white",
fg="black", font=("宋体", 14),
bd='0') # 结果输出框
self.init_data_Text1.place(x="25", y="200", width="450", height="300")
# 按钮
self.str_trans_to_md5_button = Button(self.init_window_name, text="添加", bg="lightblue", width=10,
font=('黑体', 12), command=self.add_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=40, y=120, anchor='nw')
self.str_trans_to_md5_button = Button(self.init_window_name, text="查询", bg="lightblue", width=10,
font=('黑体', 12), command=self.show_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=200, y=120, anchor='nw')
self.str_trans_to_md5_button = Button(self.init_window_name, text="生成", bg="lightblue", width=10,
font=('黑体', 12), command=self.split_date) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.place(x=360, y=120, anchor='nw')
self.init_data_label2 = Label(self.init_window_name, text="@Author:", font=('宋体', 13), width=10)
self.init_data_label2.place(x=120, y=160, anchor='nw')
self.init_data_label3 = Label(self.init_window_name, text="聪明的波波", font=('宋体', 13), width=10)
self.init_data_label3.place(x=250, y=160, anchor='nw')
path = StringVar()
path.set(os.path.abspath(".."))
# 功能函数
def add_date(self):
src = self.init_data_Text.get(1.0, END)
if len(src) <= 1:
self.init_data_Text.delete(1.0, END)
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "请不要输入空白信息!!!")
else:
src = np.array(src)
a.append(src)
self.init_data_Text.delete(1.0, END)
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "添加成功")
def show_date(self):
self.init_data_Text1.delete(1.0, END)
if len(a) < 1:
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "暂无内容,请先添加有效信息!")
else:
c = []
b = a
b = np.array(b)
b = b.reshape(-1, 1)
b = b[:, 0]
tmp = np.arange(len(a))
c.append(tmp)
c = np.array(c)
b = b[c]
b = b.T
title = ['序号', '姓名']
self.init_data_Text1.insert(1.0, tabulate(b, headers=title,
tablefmt='grid', showindex=np.arange(1, len(a)+1)))
def split_date(self):
self.init_data_Text1.delete(1.0, END)
if len(a) < 1:
self.init_data_Text1.delete(1.0, END)
self.init_data_Text1.insert(1.0, "暂无内容,无法生成!")
else:
self.init_data_Text1.delete(1.0, END)
c = []
b = a
b = np.array(b)
b = b.reshape(-1, 1)
b = b[:, 0]
tmp = random.sample(range(len(a)), len(a))
c.append(tmp)
c = np.array(c)
title = ['序号', '名称']
result = b[c]
result = result.T
self.init_data_Text1.insert(1.0, tabulate(result, headers=title, tablefmt='grid',
showindex=np.arange(1, len(a) + 1)))
def gui_start():
init_window = Tk() # 实例化出一个父窗口
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗口默认属性
ZMJ_PORTAL.set_init_window()
init_window.mainloop() # 父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示
gui_start()