From 441968436b868eda0e8b5627ba8e3078df64d720 Mon Sep 17 00:00:00 2001 From: p9kh64cfp <1047063963@qq.com> Date: Tue, 31 Dec 2024 11:20:37 +0800 Subject: [PATCH] ADD file via upload --- gui.py | 200 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 gui.py diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..e8427bb --- /dev/null +++ b/gui.py @@ -0,0 +1,200 @@ +from warnings import simplefilter +simplefilter(action='ignore', category=FutureWarning) +from tkinter import ttk +import tkinter +import cv2 +import numpy as np +from tkinter import * +from PIL import Image,ImageTk +from model_improved_alexnet import ImprovedAlexNet#调用模型 +from tkinter.filedialog import askopenfilename +import tkinter.messagebox +import torch +from predict_improved_alexnet import improved_alexnet_predict#调用预测函数 +import warnings +import os +warnings.filterwarnings("ignore") +from tkinter import * +import tkinter.simpledialog +import tkinter as tk +import tkinter.simpledialog as sd +from PIL import Image,ImageTk +import matplotlib.pyplot as plt#画图库 +plt.rcParams['font.sans-serif']=['PingFang'] +#plt.rcParams['axes.unicode_minus'] = False + +class CustomDialog(sd.Dialog): + def __init__(self, parent, title=None, background_image='bg.png', user_icon_path='user.gif', password_icon_path='hmenu-lock.gif'): + self.background_image = background_image + self.user_icon_path = user_icon_path + self.password_icon_path = password_icon_path + super().__init__(parent, title) + + def body(self, master): + # 加载背景图 + bg_image = Image.open(self.background_image) + bg_photo = ImageTk.PhotoImage(bg_image) + new_width = 400 + new_height = 150 + style = ttk.Style() + style.configure('ExtraLarge.TButton', font=('Arial', 16), padding=15) + self.bg_label = tk.Label(master, image=bg_photo) + self.bg_label.image = bg_photo # 保持对图片的引用 + self.bg_label.place(x=0, y=0, relwidth=10, relheight=10) # 背景标签覆盖整个对话框区域 + # 调整对话框尺寸 + self.geometry(f"{new_width}x{new_height}") + + # 加载用户名图标 + user_icon_image = Image.open(self.user_icon_path) + user_icon_photo = ImageTk.PhotoImage(user_icon_image) + + # 加载密码图标 + password_icon_image = Image.open(self.password_icon_path) + password_icon_photo = ImageTk.PhotoImage(password_icon_image) + + # 创建带用户名图标的标签 + label_with_user_icon = tk.Label(master, text="用户名:", image=user_icon_photo, compound='left', font=('Arial', 16)) + label_with_user_icon.grid(row=0) + label_with_user_icon.image = user_icon_photo # 保持对用户名图标图片的引用 + + # 创建带密码图标的标签 + label_with_password_icon = tk.Label(master, text="密码:", image=password_icon_photo, compound='left', font=('Arial', 16)) + label_with_password_icon.grid(row=1) + label_with_password_icon.image = password_icon_photo # 保持对密码图标图片的引用 + + #创建用于输入用户名和密码的文本框,字体为arial,大小为16 + self.entry1 = tk.Entry(master, font=('Arial', 16)) + self.entry2 = tk.Entry(master, font=('Arial', 16), show='*')#密码显示为* + + #确定文本框位置 + self.entry1.grid(row=0, column=1) + self.entry2.grid(row=1, column=1) + + return self.entry1 # 设置初始焦点 + + #获取用户输入的两个值并将它们作为一个元组存储在self.result变量中 + def apply(self): + first_value = self.entry1.get() + second_value = self.entry2.get() + self.result = (first_value, second_value) + + +# 设置窗体 +root = Tk()#创建主窗口 +root.withdraw()#隐藏主窗口 +dialog = CustomDialog(root, "登录")#显示登陆窗口 +result = dialog.result +#print("输入框1的值:", result[0]) +#print("输入框2的值:", result[1]) +if result is not None and str(result[0])=='12345' and str(result[1]) == '12345': + tkinter.messagebox.showinfo('提示:', '欢迎进入 中药识别') + root = Toplevel() +else: + tkinter.messagebox.showinfo('提示:', '登录失败') + exit(-1) + +# 设置窗体 +#root = Tk() +root.title("") + +# 图片对话框信息 +path = StringVar() +file_entry = Entry(root, state='readonly', text=path) + +# 初始化 +global now_img, alexnet_model +alexnet_model = None + +#训练结果展示 +def btn_pc(): + image = plt.imread('./logs/0005.png') + plt.figure()#创建图形窗口 + plt.imshow(image)#将读取的图片显示在图形窗口上 + plt.axis('off')#关闭了图形的坐标轴显示 + plt.title('模型训练曲线01-70')#标题 + image = plt.imread('./logs/0006.png') + plt.figure() + plt.imshow(image) + plt.axis('off') + plt.title('模型混淆矩阵01-70') + image = plt.imread('./logs/0007.png') + plt.figure() + plt.imshow(image) + plt.axis('off') + plt.title('模型混淆矩阵71-100') + image = plt.imread('./logs/0008.png') + plt.figure() + plt.imshow(image) + plt.axis('off') + plt.title('模型混淆矩阵71-100') + plt.show() + +# 选择图片 +def choosepic(): + default_dir = r"./test/" + path_ = askopenfilename(title=u'选择文件', initialdir=(os.path.expanduser(default_dir))) + if len(path_) < 1:#若所选文件路径长度小于1,即代表没有这个文件 + return + path.set(path_)#路径赋值给path + global now_img + # 设置图片路径 + now_img = file_entry.get() + #print(now_img) + img_open = Image.open(file_entry.get())#打开图片 + img_open = img_open.resize((1100, 700))#调整大小 + # 显示图片到窗体 + img = ImageTk.PhotoImage(img_open)#将打开的图片转换为Tkinter可用的 + image_label.config(image=img)#将图片显示在窗口中 + image_label.image = img#将转换后的图片对象保存在image_label中,显示在窗口中 + +# 退出软件 +def btn_exit(): + exit(0) + +# 调用模型 +def btn_ai(): + global now_img + global alexnet_model + if alexnet_model is None: + # create model + alexnet_model = ImprovedAlexNet(num_classes=11) + # load model weights + model_weight_path = "./models/se-inc-alexnet.pth"#调用模型 + alexnet_model.load_state_dict(torch.load(model_weight_path,map_location='cpu')) + alexnet_model.eval() + res=improved_alexnet_predict(now_img,alexnet_model)#调用预测函数进行并预测 + s=str(res)#转化为字符形式 + tkinter.messagebox.showinfo('提示:',s)#显示一个提示框,包含预测结果 + +# 显示识别率 +def btn_acc(): + res = '' + with open('./logs/model.txt', 'r', encoding='utf-8') as fb: + s = fb.read() + res = res + '识别率是:%.2f%%'%(float(s)*100) + tkinter.messagebox.showinfo('提示:', res) + +# 设置窗体 可调整 主窗口 +mainframe = ttk.Frame(root, padding="5 4 12 12") +mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) +mainframe.columnconfigure(0, weight=1) +mainframe.rowconfigure(0, weight=1)#使得当窗口调整大小时,该列/行也会相应地调整大小 +# 配置按钮,联系上述对应功能 +style = ttk.Style() +style.configure('ExtraLarge.TButton', font=('Arial', 16), padding=15) +#创建按钮 +ttk.Button(mainframe, text="模型训练", command=btn_pc, style='ExtraLarge.TButton').grid(column=1, row=4, sticky=W)#左对齐 +ttk.Button(mainframe, text="选择图片", command=choosepic, style='ExtraLarge.TButton').grid(column=2, row=4, sticky=W) +ttk.Button(mainframe, text="图像识别", command=btn_ai, style='ExtraLarge.TButton').grid(column=4, row=4, sticky=W) +ttk.Button(mainframe, text="模型准确率", command=btn_acc, style='ExtraLarge.TButton').grid(column=6, row=4, sticky=W) +ttk.Button(mainframe, text="关闭软件", command=btn_exit, style='ExtraLarge.TButton').grid(column=7, row=4, sticky=W) +# 显示初始化 +image_label = ttk.Label(root,compound=CENTER) +image_label.grid(column=0,row=5, sticky=W) +bg = "./bg2.PNG"#封面 +pil_image = Image.open(bg)#打开图片 +pil_image = pil_image.resize((1100, 700)) +img = ImageTk.PhotoImage(pil_image) +image_label.configure(image=img) + +root.mainloop()#进入Tkinter主事件循环,显示应用程序的界面并等待用户操作 \ No newline at end of file