文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GUI布局Tkinter完善Python小项目

2024-12-03 16:24

关注

 本次 Python 小项目主要功能:调用电脑摄像头实现拍照,并使用百度 API 接口实现图像识别。

上次完成了API的封装,这次完成GUI的布局。具体成品如下所示。

拍照保存图片采用的是opencv中的imwrite方法,具体的示例查看上上篇文章。

Tkinter 布局逻辑中最推荐使用的Grid布局。实现机制是将Widget逻辑上分割成表格,在指定的位置放置想要的Widget就可以了。

Grid布局参数说明

具体main.py代码如下。

  1. ""
  2. @Author:Runsen 
  3. @WeChat:RunsenLiu 
  4. @微信公众号:Python之王 
  5. @CSDN:https://blog.csdn.net/weixin_44510615 
  6. @Github:https://github.com/MaoliRUNsen 
  7. @Date:2020/11/29 
  8. ""
  9. import time 
  10. import cv2 as cv  # pip install opencv-python 
  11. import tkinter as tk 
  12. from tkinter import ttk  # 下拉框依赖库 
  13. from tkinter import scrolledtext  # 滚动文本框依赖库 
  14. from tkinter import N,E,S,W 
  15. # 引入Baidu_API类 (上次文章) 
  16. from baidu_api import Baidu_API 
  17.  
  18. # 拍照 
  19. def take_a_photo(): 
  20.     # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2 
  21.     cap = cv.VideoCapture(0) 
  22.     img_path = str(int(time.time())) + '.jpg' 
  23.     while True
  24.         # 从摄像头读取图片 
  25.         sucess, img = cap.read() 
  26.         # 转为灰度图片 
  27.         # gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 
  28.         # 显示摄像头 
  29.         cv.imshow('----------please enter "s" to take a picture----------', img) 
  30.         # 保持画面的持续,无限期等待输入 
  31.         k = cv.waitKey(1) 
  32.         if k == 27: 
  33.             # 通过esc键退出摄像 
  34.             cv.destroyAllWindows() 
  35.             break 
  36.         elif k == ord("s"): 
  37.             # 通过s键保存图片,并退出。 
  38.             cv.imwrite(img_path, img) 
  39.             cv.destroyAllWindows() 
  40.             break 
  41.     # 关闭摄像头 
  42.     cap.release() 
  43.     # 打印日志 
  44.     scr.insert(tk.END'[{}]拍摄成功...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 
  45.     # 返回图像 
  46.     return img_path 
  47.  
  48. ----------图形界面各个组件功能的设计---------- 
  49. # 清除窗口日志 
  50. def clear_the_window(): 
  51.     scr.delete(1.0, tk.END
  52.  
  53. # 退出软件 
  54. def exit(): 
  55.     win.quit() 
  56.  
  57. # 下拉框选项选择 
  58. def select_ttk(event): 
  59.     global numberChosen 
  60.     # 颜值评分 
  61.     if numberChosen.current() == 1: 
  62.         # 获取图像 
  63.         img_path = take_a_photo() 
  64.  
  65.         try: 
  66.             # 向API发送图像并获取信息 
  67.             score, age, gender, race = Baidu_API().face_detect(img_path=img_path) 
  68.  
  69.             # 打印日志 
  70.             scr.insert(tk.END'[{}]年龄「{}」性别「{}」人种「{}」\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), age, gender, race)) 
  71.             scr.insert(tk.END'[{}]颜值评分为:{}/100 分\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), score)) 
  72.         except
  73.             scr.insert(tk.END'[{}]{}'.format(time.strftime(time.strftime('%Y-%m-%d %H:%M:%S')), 
  74.                                                Baidu_API().face_detect(img_path=img_path))) 
  75.     # 手势识别 
  76.     if numberChosen.current() == 2: 
  77.         scr.insert(tk.END'[{}]请将您的手势放置摄像头前...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 
  78.         time.sleep(0.1) 
  79.         img_path = take_a_photo() 
  80.         try: 
  81.             classname_en, classname_zh = Baidu_API().gesture(img_path=img_path) 
  82.             scr.insert(tk.END
  83.                        '[{}]手势大意:{}({})\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), classname_zh, classname_en)) 
  84.         except
  85.             scr.insert(tk.END
  86.                        '[{}]{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), Baidu_API().gesture(img_path=img_path))) 
  87.     # 智能人脸抠图 
  88.     if numberChosen.current() == 3: 
  89.         scr.insert(tk.END'智能人脸抠图\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 
  90.         img_path = take_a_photo() 
  91.         out_path = str(int(time.time())) + '.jpg' 
  92.         try: 
  93.             Baidu_API().body_seg(img_path=img_path, out_path=out_path) 
  94.             scr.insert(tk.END'完成智能人脸抠图'
  95.         except
  96.             scr.insert(tk.END'[{}]{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), 
  97.                                                  Baidu_API().body_seg(img_path=img_path, out_path=None))) 
  98.  
  99.  
  100. -------------创建窗口-------------- 
  101. win = tk.Tk() 
  102. win.title('客官先关注微信公众号:Python之王!'
  103. win.geometry('600x300'
  104.  
  105. ------------窗口组件设计----------- 
  106. # grid中的参数:column, columnspan, in, ipadx, ipady, padx, pady, row, rowspan,sticky 
  107.  
  108. # 下拉框组件 
  109. number = tk.StringVar 
  110. numberChosen = ttk.Combobox(win, textvariable=number) 
  111. numberChosen['value'] = ('please select''给我的颜值打个分吧!''识别一下我的手势''智能人脸抠图'
  112.  
  113. numberChosen.current(0)  # 设置默认值为第一个,即默认下拉框中的内容 
  114.  
  115. numberChosen.grid(row=1, column=1, rowspan=1, sticky=N + E + S + W) 
  116. # 下拉框触发动作 (绑定点击事件) 
  117. numberChosen.bind('<>', select_ttk) 
  118.  
  119. # 清除按钮组件 
  120. tk.Button(win, cnf={'text''clear''command': clear_the_window}).grid(row=1, column=2, ipadx=1, sticky=N + E + S + W) 
  121.  
  122. # 退出按钮组件 
  123. tk.Button(win, cnf={'text''exit''command': exit}).grid(row=1, column=3, ipadx=1, sticky=N + E + S + W) 
  124.  
  125. # 滚动文本框组件 
  126. scr = scrolledtext.ScrolledText(win) 
  127. scr.grid(row=2, column=1, columnspan=3, rowspan=1) 
  128.  
  129. # 使窗口一直显示 
  130. win.mainloop() 

最后使用Pyinstaller打包即可。

Java 一次编译到处运行,Python没有这么好本事,Python有一个pyinstaller可以打包exe,在window平台下运行,这也是Python非常不好的方面,而且打包出来的占用内存非常的大

安装:pip install pyinstaller。Pyinstaller具体参数如下所示。

注意点:有的时候在代码最后面加上input(),这样打开exe不会一散而过。由于上面代码本身就是窗口一直显示,无需加上input()。

在打包时候,并没有提示错误,可以顺利打包成 exe 文件。但是在运行打包好的软件时,会提示找不到模块,本人遇到的是找不到第三方模块,例如 cv2 。这时候需要在打包时指定 -p 参数,后面跟上 python 目录下的第三方库模板目录路径 site-packages ,再打包就成功了。

cd 到代码的目录执行 pyinstaller main.py -F -p F:\anaconda\Lib\site-packages如果Pyinstaller打包报错numpy.core.multiarray failed to import,这是numpy和opencv的不兼容,可以降低numpy的版本。

 

来源:Python之王内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯