- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章GUI布局Tkinter完善Python小项目由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本次 Python 小项目主要功能:调用电脑摄像头实现拍照,并使用百度 API 接口实现图像识别.
上次完成了API的封装,这次完成GUI的布局。具体成品如下所示.
拍照保存图片采用的是opencv中的imwrite方法,具体的示例查看上上篇文章.
Tkinter 布局逻辑中最推荐使用的Grid布局。实现机制是将Widget逻辑上分割成表格,在指定的位置放置想要的Widget就可以了.
Grid布局参数说明 。
具体main.py代码如下.
""" 。
@Author:Runsen 。
@WeChat:RunsenLiu 。
@微信公众号:Python之王 。
@CSDN:https://blog.csdn.net/weixin_44510615 。
@Github:https://github.com/MaoliRUNsen 。
@Date:2020/11/29 。
""" 。
import time 。
import cv2 as cv # pip install opencv-python 。
import tkinter as tk 。
from tkinter import ttk # 下拉框依赖库 。
from tkinter import scrolledtext # 滚动文本框依赖库 。
from tkinter import N,E,S,W 。
# 引入Baidu_API类 (上次文章) 。
from baidu_api import Baidu_API 。
。
# 拍照 。
def take_a_photo(): 。
# 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2 。
cap = cv.VideoCapture(0) 。
img_path = str(int(time.time())) + '.jpg' 。
while True: 。
# 从摄像头读取图片 。
sucess, img = cap.read() 。
# 转为灰度图片 。
# gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 。
# 显示摄像头 。
cv.imshow('----------please enter "s" to take a picture----------', img) 。
# 保持画面的持续,无限期等待输入 。
k = cv.waitKey(1) 。
if k == 27: 。
# 通过esc键退出摄像 。
cv.destroyAllWindows() 。
break 。
elif k == ord("s"): 。
# 通过s键保存图片,并退出。 。
cv.imwrite(img_path, img) 。
cv.destroyAllWindows() 。
break 。
# 关闭摄像头 。
cap.release() 。
# 打印日志 。
scr.insert(tk.END, '[{}]拍摄成功...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 。
# 返回图像 。
return img_path 。
。
# ----------图形界面各个组件功能的设计---------- 。
# 清除窗口日志 。
def clear_the_window(): 。
scr.delete(1.0, tk.END) 。
。
# 退出软件 。
def exit(): 。
win.quit() 。
。
# 下拉框选项选择 。
def select_ttk(event): 。
global numberChosen 。
# 颜值评分 。
if numberChosen.current() == 1: 。
# 获取图像 。
img_path = take_a_photo() 。
。
try: 。
# 向API发送图像并获取信息 。
score, age, gender, race = Baidu_API().face_detect(img_path=img_path) 。
。
# 打印日志 。
scr.insert(tk.END, '[{}]年龄「{}」性别「{}」人种「{}」\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), age, gender, race)) 。
scr.insert(tk.END, '[{}]颜值评分为:{}/100 分\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), score)) 。
except: 。
scr.insert(tk.END, '[{}]{}'.format(time.strftime(time.strftime('%Y-%m-%d %H:%M:%S')), 。
Baidu_API().face_detect(img_path=img_path))) 。
# 手势识别 。
if numberChosen.current() == 2: 。
scr.insert(tk.END, '[{}]请将您的手势放置摄像头前...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 。
time.sleep(0.1) 。
img_path = take_a_photo() 。
try: 。
classname_en, classname_zh = Baidu_API().gesture(img_path=img_path) 。
scr.insert(tk.END, 。
'[{}]手势大意:{}({})\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), classname_zh, classname_en)) 。
except: 。
scr.insert(tk.END, 。
'[{}]{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), Baidu_API().gesture(img_path=img_path))) 。
# 智能人脸抠图 。
if numberChosen.current() == 3: 。
scr.insert(tk.END, '智能人脸抠图\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) 。
img_path = take_a_photo() 。
out_path = str(int(time.time())) + '.jpg' 。
try: 。
Baidu_API().body_seg(img_path=img_path, out_path=out_path) 。
scr.insert(tk.END, '完成智能人脸抠图') 。
except: 。
scr.insert(tk.END, '[{}]{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), 。
Baidu_API().body_seg(img_path=img_path, out_path=None))) 。
。
。
# -------------创建窗口-------------- 。
win = tk.Tk() 。
win.title('客官先关注微信公众号:Python之王!') 。
win.geometry('600x300') 。
。
# ------------窗口组件设计----------- 。
# grid中的参数:column, columnspan, in, ipadx, ipady, padx, pady, row, rowspan,sticky 。
。
# 下拉框组件 。
number = tk.StringVar 。
numberChosen = ttk.Combobox(win, textvariable=number) 。
numberChosen['value'] = ('please select', '给我的颜值打个分吧!', '识别一下我的手势', '智能人脸抠图') 。
。
numberChosen.current(0) # 设置默认值为第一个,即默认下拉框中的内容 。
。
numberChosen.grid(row=1, column=1, rowspan=1, sticky=N + E + S + W) 。
# 下拉框触发动作 (绑定点击事件) 。
numberChosen.bind('<<ComboboxSelected>>', select_ttk) 。
。
# 清除按钮组件 。
tk.Button(win, cnf={'text': 'clear', 'command': clear_the_window}).grid(row=1, column=2, ipadx=1, sticky=N + E + S + W) 。
。
# 退出按钮组件 。
tk.Button(win, cnf={'text': 'exit', 'command': exit}).grid(row=1, column=3, ipadx=1, sticky=N + E + S + W) 。
。
# 滚动文本框组件 。
scr = scrolledtext.ScrolledText(win) 。
scr.grid(row=2, column=1, columnspan=3, rowspan=1) 。
。
# 使窗口一直显示 。
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的版本.
原文地址:https://mp.weixin.qq.com/s/HjgRpGs1P_ltqci2IP2_2g 。
。
最后此篇关于GUI布局Tkinter完善Python小项目的文章就讲到这里了,如果你想了解更多关于GUI布局Tkinter完善Python小项目的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 NetBeans 开发 Java 中的 WebService,并使用 gradle 作为依赖管理。 我找到了this article关于使用 gradle 开发 Web 项目。它使用 Gr
我正在将旧项目从 ant 迁移到 gradle(以使用其依赖项管理和构建功能),并且在生成 时遇到问题>eclipse 项目。今天的大问题是因为该项目有一些子项目被拆分成 war 和 jar 包部署到
我已经为这个错误苦苦挣扎了很长时间。如果有帮助的话,我会提供一些问题的快照。请指导我该怎么办????在我看来,它看起来一团糟。 *** glibc detected *** /home/shivam/
我在 Ubuntu 12.10 上运行 NetBeans 7.3。我正在学习 Java Web 开发类(class),因此我有一个名为 jsage8 的项目,其中包含我为该类(class)所做的工作。
我想知道 Codeplex、GitHub 等中是否有任何突出的项目是 C# 和 ASP.NET,甚至只是 C# API 与功能测试 (NUnit) 和模拟(RhinoMocks、NMock 等)。 重
我创建了一个 Maven 项目,包装类型为“jar”,名为“Y”我已经完成了“Maven 安装”,并且可以在我的本地存储库中找到它.. 然后,我创建了另一个项目,包装类型为“war”,称为“X”。在这
我一直在关注the instructions用于将 facebook SDK 集成到我的应用程序中。除了“helloFacebookSample”之外,我已经成功地编译并运行了所有给定的示例应用程序。
我想知道,为什么我们(Java 社区)需要 Apache Harmony 项目,而已经有了 OpenJDK 项目。两者不是都是在开源许可下发布的吗? 最佳答案 事实恰恰相反。 Harmony 的成立是
我正在尝试使用 Jsoup HTML Parser 从网站获取缩略图 URL我需要提取所有以 60x60.jpg(或 png)结尾的 URL(所有缩略图 URL 都以此 URL 结尾) 问题是我让它在
我无法构建 gradle 项目,即使我编辑 gradle 属性,我也会收到以下错误: Error:(22, 1) A problem occurred evaluating root project
我有这个代码: var NToDel:NSArray = [] var addInNToDelArray = "Test1 \ Test2" 如何在 NToDel:NSArray 中添加 addInN
如何在单击显示更多(按钮)后将主题列表限制为 5 个(项目)。 还有 3(项目),依此类推到列表末尾,然后它会显示显示更少(按钮)。 例如:在 Udemy 过滤器选项中,当您点击查看更多按钮时,它仅显
如何将现有的 Flutter 项目导入为 gradle 项目? “导入项目”向导要求 Gradle 主路径。 我有 gradle,安装在我的系统中。但是这里需要设置什么(哪条路径)。 这是我正在尝试的
我有一个关于 Bitbucket 的项目。只有源被提交。为了将项目检索到新机器上,我在 IntelliJ 中使用了 Version Control > Checkout from Ve
所以,我想更改我公司的一个项目,以使用一些与 IDE 无关的设置。我在使用 Tomcat 设置 Java 应用程序方面有非常少的经验(我几乎不记得它是如何工作的)。 因此,为了帮助制作独立于 IDE
我有 2 个独立的项目,一个在 Cocos2dx v3.6 中,一个在 Swift 中。我想从 Swift 项目开始游戏。我该怎么做? 我已经将整个 cocos2dx 项目复制到我的 Swift 项目
Cordova 绝对是新手。这些是我完成的步骤: checkout 现有项目 运行cordova build ios 以上生成此构建错误: (node:10242) UnhandledPromiseR
我正在使用 JQuery 隐藏/显示 li。我的要求是,当我点击任何 li 时,它应该显示但隐藏所有其他 li 项目。当我将鼠标悬停在文本上时 'show all list item but don
我想将我所有的java 项目(223 个项目)迁移到gradle 项目。我正在使用由 SpringSource STS 团队开发的 Gradle Eclipse 插件。 目前,我所有的 java 项目
我下载this Eclipse Luna ,对于 Java EE 开发人员,如描述中所见,它支持 Web 应用程序。我找不到 file -> new -> other -> web projects
我是一名优秀的程序员,十分优秀!