以前在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
查看评论