【行空板教程】写字板

前言

我们知道行空板有一块2.8寸的彩屏还一块触摸屏,不搞点事情总感觉浪费了,之前做了语音识别的教程,很多读者都用语音识别做了很多有趣的小项目,那么我就想能不能做一个手写输入法呢?这篇教程算是前期准备教程,我们如何运用行空板库已有的API来做一个写字板呢?好了,废话不多说了,就让开始本次的教程吧。

相关知识点

1、线 draw_line

语法:控件对象名 = GUI对象.draw_line(x0, y0, x1, y1, width, color, onclick)

  • **返回值:**文字对象
  • 输入参数:
    • x0 : 起点横坐标
    • y0 : 起点纵坐标
    • x1 : 终点横坐标
    • y1 : 终点纵坐标
    • width : 线的粗细
    • color : 线的颜色
    • onclick : 当被点击时触发的回调函数
  • 用法举例:
from unihiker import GUI   #导入包
gui=GUI()  #实例化GUI类
gui.draw_line(x0=10, y0=60, x1= 80, y1=60, width=5, color=(122,222,44), onclick=lambda: print("line clicked"))import time
while True:#增加等待,防止程序退出和卡住time.sleep(1)

2、鼠标坐标 on_mouse_move

语法:GUI对象.on_mouse_move(回调函数名)

  • 返回值:
  • 输入参数: 回调函数名
  • 用法举例:
from unihiker import GUI   #导入包
gui=GUI()  #实例化GUI类
info_text = gui.draw_text(x=120, y=320, text='鼠标坐标',origin='bottom')def mouse_move(x, y):info_text.config(text="坐标:x={},y={}".format(x, y))print(x,y)
gui.on_mouse_move(mouse_move)import time
while True:#增加等待,防止程序退出和卡住time.sleep(1)

项目思路

在我们触控屏幕的时候,其实我们的鼠标会跟着我们的手指进行移动,这个是个适合会返回鼠标的(x,y)坐标,我们使用一个列表保存所有移动过的点,然后要画线的时候,循环遍历列表,依次画出列表中点到定点之间的线即可。把所有相邻两个点之间都画一条线,就能断断续续连成鼠标的痕迹了。

程序编写

1、写字板1.0

from unihiker import GUI   #导入包
import timegui=GUI()  #实例化GUI类
pos_xy = [] # 用来装鼠标的坐标。gui.on_a_click(lambda: line_clear()) # A键盘被按下 清屏所有gui对象和pox_xy列表中的数据
gui.on_b_click(lambda: pos_xy.clear()) # B按键被按下,清空pox_xy列表def line_clear():gui.clear()pos_xy.clear()def mouse_move(x, y):'''首先判断pos_xy列表中是不是至少有两个点了然后将pos_xy中第一个点赋值给point_start利用中间变量pos_tmp遍历整个pos_xy列表point_end = pos_tmp画point_start到point_end之间的线point_start = point_end这样,不断地将相邻两个点之间画线,就能留下鼠标移动轨迹了'''pos_xy.append([x,y])if len(pos_xy) > 1:point_start = pos_xy[0]for pos_tmp in pos_xy:point_end = pos_tmpgui.draw_line(x0=point_start[0],y0=point_start[1],x1=point_end[0],y1=point_end[1],width=2, color=(122,222,125))point_start = point_endgui.on_mouse_move(mouse_move)       while True:#增加等待,防止程序退出和卡住time.sleep(1)

效果:

2、写字板2.0

从上面的效果,我们实现了写字的功能,但是我们写1后抬手准备写2,它就会默认把我们的1的尾部和2的头相连。那么我们如果解决呢?这里我看了行空板的库没有找到屏幕是否被按下的API,又或者是鼠标不被按下后无返回值。这里我主要是使用了time函数来标记。

具体程序如下:

from unihiker import GUI   #导入包
import timegui=GUI()  #实例化GUI类
pos_xy = [] # 用来装鼠标的坐标。
temp_time =0  gui.on_a_click(lambda: line_clear())
gui.on_b_click(lambda: pos_xy.clear())
def line_clear():gui.clear()pos_xy.clear()def mouse_move(x, y):global temp_timetemp_time = time.time()'''首先判断pos_xy列表中是不是至少有两个点了然后将pos_xy中第一个点赋值给point_start利用中间变量pos_tmp遍历整个pos_xy列表point_end = pos_tmp画point_start到point_end之间的线point_start = point_end这样,不断地将相邻两个点之间画线,就能留下鼠标移动轨迹了'''pos_xy.append([x,y])if len(pos_xy) > 1:point_start = pos_xy[0]for pos_tmp in pos_xy:point_end = pos_tmpgui.draw_line(x0=point_start[0],y0=point_start[1],x1=point_end[0],y1=point_end[1],width=2, color=(122,222,125))point_start = point_endgui.on_mouse_move(mouse_move)       while True:#增加等待,防止程序退出和卡住time.sleep(1)if(time.time() - temp_time > 0.0001 ):pos_xy.clear()

效果:

注:目前字体与字体之间的连线,我目前还没有一个更好的办法DEBUG:尝试了两点坐标的偏差值来判断,

if( x-temp_x > 20 or y-temp_y >20):pos_xy.clear()
temp_x = x
temp_y = y

效果不佳,如果官方给一个屏幕是否被按下的API,上述问题就很轻松解决了

3、写字板3.0

from unihiker import GUI   #导入包
import timegui=GUI()  #实例化GUI类pos_xy = [] # 用来装鼠标的坐标。
temp_time =0
penColor="black"
#每个色块被点击,我们就改变线条的颜色
gui.fill_rect(x=0, y=0, w=40, h=30,  color="green",onclick=lambda: changeColor("green"))
gui.fill_rect(x=40, y=0, w=40, h=30,  color="red",onclick=lambda: changeColor("red"))
gui.fill_rect(x=80, y=0, w=40, h=30,  color="blue",onclick=lambda: changeColor("blue"))
gui.fill_rect(x=120, y=0, w=40, h=30,  color="black",onclick=lambda: changeColor("black"))
gui.fill_rect(x=160, y=0, w=40, h=30,  color="orange",onclick=lambda: changeColor("orange"))
gui.fill_rect(x=200, y=0, w=40, h=30,  color="pink",onclick=lambda: changeColor("pink"))gui.on_a_click(lambda: line_clear())
gui.on_b_click(lambda: pos_xy.clear())def changeColor(color):# 切换线条颜色global penColorpenColor = colorprint(penColor)def line_clear():# 清屏操作gui.clear()pos_xy.clear()gui.fill_rect(x=0, y=0, w=40, h=30,  color="green",onclick=lambda: changeColor("green"))gui.fill_rect(x=40, y=0, w=40, h=30,  color="red",onclick=lambda: changeColor("red"))gui.fill_rect(x=80, y=0, w=40, h=30,  color="blue",onclick=lambda: changeColor("blue"))gui.fill_rect(x=120, y=0, w=40, h=30,  color="black",onclick=lambda: changeColor("black"))gui.fill_rect(x=160, y=0, w=40, h=30,  color="orange",onclick=lambda: changeColor("orange"))gui.fill_rect(x=200, y=0, w=40, h=30,  color="pink",onclick=lambda: changeColor("pink"))def mouse_move(x, y):# 画线global temp_time,penColortemp_time = time.time()'''首先判断pos_xy列表中是不是至少有两个点了然后将pos_xy中第一个点赋值给point_start利用中间变量pos_tmp遍历整个pos_xy列表point_end = pos_tmp画point_start到point_end之间的线point_start = point_end这样,不断地将相邻两个点之间画线,就能留下鼠标移动轨迹了'''pos_xy.append([x,y])if len(pos_xy) > 1:point_start = pos_xy[0]for pos_tmp in pos_xy:point_end = pos_tmpline_text= gui.draw_line(x0=point_start[0],y0=point_start[1],x1=point_end[0],y1=point_end[1],width=4,color=penColor)point_start = point_endgui.on_mouse_move(mouse_move)       while True:#增加等待,防止程序退出和卡住time.sleep(1)if(time.time() - temp_time > 0.000001 ):pos_xy.clear()

效果:

总结

enen~!本次【行空板教程】写字板到这里就结束了,里面有些功能的实现还不算太完美,如果读者有更好的办法,欢迎讨论。现在我们可以实现写字的功能了,那么距离我们手写输入法是不是更近了一步。【行空板教程】手写输入法 敬请期待,更多教程欢迎关注个人公众号:跟着hockel玩科创。

【行空板教程】写字板相关推荐

  1. 计算机系统写字板,什么是电脑写字板 电脑写字板使用方法

    随着科技的不断进步,家家户户都有电脑,它也成了我们日常生活中最必不可少的组成,电脑写字板不知道您有没有听说过,今天我们就要来探究探究它,一起往下看吧! 什么是电脑写字板 电脑手写板,又叫手写板(手写绘 ...

  2. 编辑html的写字板,jQuery写字板插件

    jSignature是一款jQuery写字板插件.jSignature基于HTML5 canvas,可以制作跨平台,支持移动手机的写字板效果. 使用方法 在页面中引入下面的文件. HTML结构 使用下 ...

  3. 【java毕业设计】基于java+swing的模拟写字板设计与实现(毕业论文+程序源码)——模拟写字板

    基于java+swing的模拟写字板设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing的模拟写字板设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报 ...

  4. 基于java的模拟写字板系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的模拟写字板的设计与实现 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编程和 ...

  5. [计算机毕设]基于java的模拟写字板的设计与实现(项目报告+答辩PPT+源代码+数据库)

    项目说明报告 基于Java的模拟写字板的设计与实现 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编 ...

  6. 【项目精选】基于Java的模拟写字板的设计与实现(视频+论文+源码)

    点击下载源码 此系统是使用Java语言实现简易写字板程序,能够进行输入文字操作,并具有新建文件,打开文件,保存文件,退出,复制,粘贴,剪切,全选,撤销等多种基本功能.本系统结构如下: (1)菜单栏: ...

  7. 【全源码及文档】基于Java的模拟写字板的设计与实现

    摘 要 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言.此简易JAVA写字板 ...

  8. 蘑菇云「行空板Python入门教程」第七课:舒尔特方格小游戏

    注意力是一切学习的根本,是大脑进行感知.学习.思维等认知活动的基本条件.然而,无论是孩子还是成年人,我们常常会因开小差.注意力无法集中而困扰.此时,找到一个合适的方法来训练我们的注意力势在必行. 舒尔 ...

  9. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

最新文章

  1. 跟锦数学2017年04月
  2. 使用sqlmap直连数据库获取webshell
  3. Ibatis学习总结7--SqlMapClient 执行 SQL 语句
  4. 血压测量:很重要的事情!
  5. 亲测!这款耳机性价比堪比 AirPods
  6. 怎样将程序猿写出来的程序打包成安装包(最简单的)
  7. 把散乱的SQL赶出程序代码中
  8. LINUX安装7Zip
  9. 物联网边缘-物联网准入或接入安全防护产品及解决方案
  10. 软件测试 白盒测试用例设计方法动态 逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)基本路径测试法
  11. 利用实体类接收中国电信物联网平台推送的数据
  12. 30行Python代码爬取LOL全英雄皮肤
  13. web大作业介绍自己的家乡_中国10大乡村名鸭!快来看看自己家乡的鸭子是否上榜...
  14. WebService的四种客户端调用方式(基本)
  15. cmd命令重启服务器
  16. Kubernetes之Volumes
  17. 2D-2D:对极几何与三角测量
  18. Spring集成Hibernate5_03-HibernateDaoSupport
  19. 数据库 数据目录
  20. u8信息服务器,u8服务器的配置

热门文章

  1. 关于 z-Stack MT层的使用
  2. 链接数据库明明有值,但是取到的是空
  3. gdpr隐私保护_组织必须遵循的GDPR数据隐私的5个关键原则
  4. python Django 模型操作
  5. FPGA学习: Verilog刷题记录(15)
  6. android 音频合并
  7. 【转载】 恢复百度云同步盘本地误删的文件(2篇)
  8. 讲讲如何写论文和发论文(通信类)
  9. Java中多态的粗浅见解
  10. ROS TF 常用接口函数