以前在Windows上做界面用MFC,现在做算法都是基于Python,所以转用Python的Tkinter库来做。主要是能使用Opencv和Torch处理数据,然后在界面上显示。
效果如下:
主要包括3个板块,其余还有一些小功能:
1、显示固定的图片。或从电脑加载一张图片并显示(涉及到按钮的响应函数编写和弹窗)
2、下拉框和文本框的使用
3、进度条的使用(涉及到多线程)
Tkinter支持控件自动调整布局,但是时间比较赶就不研究了,使用固定位置布局,界面也不给调整。
控件名称
Buttom 按钮,软件交互功能实现
Label (叫什么不重要),用来显示图片或文字
ComboBox 下拉框,做选择
Entry 文本框,做文本输入
Progressbar 进度条,算法跑起来之后显示进度
LabelFrame (...),灰色的框框,模块化布局控件
代码如下:
-
import tkinter
as tk
-
import tkinter.ttk
as ttk
-
import tkinter.messagebox
-
import tkinter.filedialog
-
import cv2
as cv
-
from PIL
import Image, ImageTk
-
import time
-
import threading
-
-
RELIEF=[
'flat',
'raised',
'sunken',
'solid',
'ridge',
'groove']
-
CURSOR=[
'arrow',
'circle',
'clock',
'cross',
'dotbox',
'exchange',
-
'fleur',
'heart',
'man',
'mouse',
'pirate',
'plus',
-
'shuttle',
'sizing',
'spider',
'spraycan',
'star',
'target',
-
'tcross',
'trek',
'watch']
-
-
def PIL2CV(im):
-
im = im[:, :, ::
-1]
-
return ImageTk.PhotoImage(Image.fromarray(im))
-
-
def Buttom1_CallBack():
-
filename = tk.filedialog.askopenfilename()
#弹出文件选择对话框
-
if filename==
'':
#用户没有选择任何文件
-
return
-
new_img = cv.imread(filename)
-
if new_img
is
None:
-
tk.messagebox.showerror(
'抱歉',
'图片加载失败!')
-
return
-
new_img = cv.resize(new_img, (
130,
120))
-
new_img = PIL2CV(new_img)
-
#后面两句实现图片切换显示
-
Label2.configure(image=new_img, width=
130, height=
120)
-
Label2.image = new_img
-
tk.messagebox.showinfo(
'提示',
'加载图片完成!')
-
-
def Buttom2_CallBack():
-
info = Combobox1.get()
-
param = Entry1.get()
-
tk.messagebox.showwarning(
'警告',
'你选择了:'+info+
' '+param)
-
-
def process_code(delay):
-
for i
in range(
100):
-
Progressbar1[
'value'] = i+
1
-
root.update()
-
time.sleep(delay)
-
Buttom3.configure(text=
'开始处理', state=
'normal')
-
tk.messagebox.showinfo(
'提示',
'处理完成!')
-
Progressbar1.configure(value=
0)
-
-
def Buttom3_CallBack():
-
yn = tk.messagebox.askyesno(
'警告',
'是否需要开始处理?')
-
if
not yn:
-
return
-
-
Buttom3.configure(text=
'处理中...', state=
'disabled')
#控件失效
-
delay =
0.01
-
-
# 单独开一个线程,绑定线程函数process_code,参数后面的','很关键
-
# 不开线程界面会进入处理函数死循环,用户体验不太好
-
t = threading.Thread(target=process_code, args=(delay,))
-
t.start()
-
-
def Buttom4_CallBack():
-
global page_count
-
if page_count<=
0:
-
page_count =
0
-
return
-
else:
-
page_count -=
1
-
Label4.configure(text=
'第'+str(page_count)+
'页')
-
return
-
-
def Buttom5_CallBack():
-
global page_count
-
if page_count>=
100:
-
page_count =
100
-
return
-
else:
-
page_count +=
1
-
Label4.configure(text=
'第' + str(page_count) +
'页')
-
return
-
-
#上面是控件的响应函数
-
################################################################################
-
#下面是界面控件的布局
-
-
#主界面
-
root = tk.Tk()
-
root.title(
'python界面测试')
#修改界面标题
-
root.iconbitmap(
'img/tm.ico')
#修改界面ico
-
root.geometry(
'800x500')
#设定界面尺寸 HxW
-
root.resizable(width=
False, height=
False)
#不允许调整窗口大小,不固定删除此行
-
-
#添加两个板块边界框
-
Frame1 = tk.LabelFrame(root, height=
200, width=
145)
-
Frame1.place(x=
15, y=
100)
-
Frame2 = tk.LabelFrame(root, text=
"结果显示", height=
400, width=
620)
-
Frame2.place(x=
170, y=
5)
-
-
#添加图片显示框、加载图片框、加载图片按钮
-
img = cv.imread(
'img/title.jpg')
#opencv加载图片
-
img = cv.resize(img, (
140,
70))
#图片缩放
-
img = PIL2CV(img)
#opencv格式转pillow
-
Label1 = tk.Label(root, image=img)
#初始化默认图片
-
Label1.place(x=
15, y=
20)
#图片显示框在界面上的位置
-
-
Label2 = tk.Label(root,
-
width=
18,height=
7,
#控件大小(注意单位不是像素)
-
bg=
"white")
#默认白色背景
-
Label2.place(x=
20,y=
110)
#图片显示框在界面上的位置
-
-
Buttom1 = tk.Button(root,
-
width=
15,height=
1,
#按钮大小
-
text=
'加载检索图片',
#按钮文本
-
relief=RELIEF[
3],
#按钮的风格
-
command=Buttom1_CallBack)
#绑定响应函数
-
Buttom1.place(x=
25, y=
250)
#按钮在界面上的位置
-
-
#添加参数文本框、下拉框、下拉框内容输出按钮
-
Combobox1 = ttk.Combobox(root, width=
17, height=
1)
-
Combobox1[
'value'] = (
'窗前明月光',
'疑是地上霜',
'举头望明月',
'明月照我影')
-
Combobox1.current(
0)
-
Combobox1.place(x=
15, y=
320)
-
-
Label3 = tk.Label(root, text=
'参数')
-
Label3.place(x=
15, y=
350)
-
-
Entry1 = ttk.Entry(root, width=
9)
#文本框为啥没有H
-
Entry1.place(x=
50, y=
350)
-
Entry1.insert(
0,
'0.5')
-
-
Buttom2 = tk.Button(root,
-
width=
15,height=
1,
-
text=
'你选择了什么?',
-
relief=RELIEF[
3],
-
command=Buttom2_CallBack)
-
Buttom2.place(x=
25, y=
380)
-
-
#添加进度条、开始处理按钮
-
Progressbar1 = ttk.Progressbar(root, length=
600, value=
0, cursor=CURSOR[
1])
-
Progressbar1.place(x=
15, y=
460)
-
-
Buttom3 = tk.Button(root,
-
width=
15,height=
1,
-
text=
'开始处理',
-
relief=RELIEF[
3],
-
command=Buttom3_CallBack)
-
Buttom3.place(x=
630, y=
455)
-
-
#添加两个滚动按钮
-
Buttom4 = tk.Button(root,
-
width=
3,height=
1,
-
text=
'<',
-
relief=RELIEF[
1],
-
command=Buttom4_CallBack)
-
Buttom4.place(x=
380, y=
410)
-
-
global page_count
#全局变量,用来控制页码
-
page_count=
0
-
Label4 = tk.Label(root, text=
'第0页')
-
Label4.place(x=
420, y=
410)
-
-
Buttom5 = tk.Button(root,
-
width=
3,height=
1,
-
text=
'>',
-
relief=RELIEF[
1],
-
command=Buttom5_CallBack)
-
Buttom5.place(x=
470, y=
410)
-
-
root.mainloop()
-
#这句话后面不能有代码
转载:https://blog.csdn.net/XLcaoyi/article/details/116270230
查看评论