黑板模拟器是一个多线程控制尝试,需要做到通过tkinter实现对鼠标的控制和监督。鼠标在移动时会有一个线程来检测鼠标的位置,计算窗口的位置,计算出鼠标在窗口中的位置,结合canvas画布实现对黑板的涂改。

黑板模拟器的功能比较单一,只有一个画白线的功能,但是这是一个多线程控制技术的尝试。之后的绝大多数发明都会用到这样的技术,因为这样的交互会更加方便,效果会更好。

首先展示功能页面:

展示一下使用效果:

教你如何用python制作黑板模拟器 python项目小发明

接下来讲解其实现原理:

前端代码:

class basedesk():#底板def __init__(self, master):self.master = masterself.master.title("黑板模拟器")self.master.configure(bg='#B1FFF9')self.master.geometry("1000x600")mainwindow(self.master)
class mainwindow():#主界面def __init__(self, master):self.master = masterself.window = tk.Frame(self.master, bg='#e5ffe5')self.window.place(x=0,y=0,width=1000,height=600)self.window.showname_label=tk.Label(self.window,text="黑板模拟器",fg='#26734d', bg='#ffe5ff',font=("Helvetic",60,"bold"),relief=RAISED).place(x=0, y=10,width=1000, height=150)self.window.enter_btn=tk.Button(self.window,text="开始",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.changetofunction).place(x=360, y=300,width=250, height=150)def changetofunction(self,):self.window.destroy()functionwindow(self.master)
class functionwindow():def __init__(self, master):self.master = masterself.init_x=Noneself.init_y=Noneself.events=[]self.boardlock=Trueself.checklock=0self.window = tk.Frame(self.master, bg='#e5f9ff')self.window.place(x=0, y=0, width=1000, height=600)self.init_canvas()self.window.enter_btn=tk.Button(self.window,text="清除",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.clean).place(x=360, y=440,width=250, height=150)

鼠标跟踪函数:

def onMouseEvent(event):return event.Position
def mouse_detector():global MOUSE_POShm = pyHook.HookManager()hm.MouseAll = onMouseEventwhile True:MOUSE_POS=list(PyMouse().position())time.sleep(0.02)

这两个函数用于返回鼠标的位置,用到了pyHook的库。通过一个while循环实现监听,达到对鼠标的位置判断。

点击后鼠标跟踪函数:

    def mouse_detector(self):global MOUSE_POSself.x = MOUSE_POS[0] - 160 - self.master.winfo_x()self.y = MOUSE_POS[1] - 82 - self.master.winfo_y()record=[self.x, self.y]while self.boardlock:self.x=MOUSE_POS[0]-160-self.master.winfo_x()self.y = MOUSE_POS[1] - 82 - self.master.winfo_y()if record!=[self.x, self.y]:self.events.append([self.init_x, self.init_y, self.x, self.y])self.window.angle_canvas.destroy()self.init_canvas()time.sleep(0.00001)record = [self.x, self.y]self.boardlock = True

当鼠标点击黑板时,需要对鼠标位置进行canvas内部监听以便绘制游离线(即没有确定具体绘制方案的线),在本设计中,黑板元素的变化主要是通过删除重绘画板实现的。这部分的while循环会判断鼠标的位置是否改变,如果没改变则不对画板进行更新操作。

黑板点击调用函数:

    def key(self,event):if self.checklock==0:self.checklock = 1 - self.checklockself.init_x = event.xself.init_y = event.yboardthread = threading.Thread(target=self.mouse_detector)boardthread.start()else:self.checklock = 1 - self.checklockself.boardlock = Falseself.events.append([self.init_x, self.init_y, self.x, self.y])

当鼠标对黑板进行点击时,会调用此函数。这部分函数主要可以根据当前的状态来选择合适的函数,self.checklock变量有0和1两种数值,不同的数值对应不同的状态和功能,分为开始绘制绘制完两种状态。self.boardlock变量则可以实现对画板内部while循环的控制。

初始化画布:

    def init_canvas(self):self.window.angle_canvas = tk.Canvas(self.window, bg='#336600')self.window.angle_canvas.place(x=150,y=50,width=700,height=300)self.window.angle_canvas.bind("<Button-1>", self.key)if self.events!=[]:if self.checklock==0:for i,item in enumerate(self.events):if i==len(self.events)-1:breakself.window.angle_canvas.create_line(item,fill='white')else:for i, item in enumerate(self.events):self.window.angle_canvas.create_line(item, fill='white')self.events = self.events[:-1]

这部分对黑板进行更新,更新分为开始绘制绘制完两种状态。

清除按键调用函数:

    def clean(self):if self.checklock==1:returnself.window.angle_canvas.destroy()self.events = []self.init_canvas()

这部分代码是清除案件的调用函数。

最后展示完整代码:

#黑板模拟器
from tkinter import *
from tkinter import messagebox
import tkinter as tk
from pymouse import PyMouse
import pyHook
import threading
import time
import os
MOUSE_POS=None
def onMouseEvent(event):return event.Position
def mouse_detector():global MOUSE_POShm = pyHook.HookManager()hm.MouseAll = onMouseEventwhile True:MOUSE_POS=list(PyMouse().position())time.sleep(0.02)
class basedesk():#底板def __init__(self, master):self.master = masterself.master.title("黑板模拟器")self.master.configure(bg='#B1FFF9')self.master.geometry("1000x600")mainwindow(self.master)
class mainwindow():#主界面def __init__(self, master):self.master = masterself.window = tk.Frame(self.master, bg='#e5ffe5')self.window.place(x=0,y=0,width=1000,height=600)self.window.showname_label=tk.Label(self.window,text="黑板模拟器",fg='#26734d', bg='#ffe5ff',font=("Helvetic",60,"bold"),relief=RAISED).place(x=0, y=10,width=1000, height=150)self.window.enter_btn=tk.Button(self.window,text="开始",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.changetofunction).place(x=360, y=300,width=250, height=150)def changetofunction(self,):self.window.destroy()functionwindow(self.master)
class functionwindow():def __init__(self, master):self.master = masterself.init_x=Noneself.init_y=Noneself.events=[]self.boardlock=Trueself.checklock=0self.window = tk.Frame(self.master, bg='#e5f9ff')self.window.place(x=0, y=0, width=1000, height=600)self.init_canvas()self.window.enter_btn=tk.Button(self.window,text="清除",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.clean).place(x=360, y=440,width=250, height=150)def mouse_detector(self):global MOUSE_POSself.x = MOUSE_POS[0] - 160 - self.master.winfo_x()self.y = MOUSE_POS[1] - 82 - self.master.winfo_y()record=[self.x, self.y]while self.boardlock:self.x=MOUSE_POS[0]-160-self.master.winfo_x()self.y = MOUSE_POS[1] - 82 - self.master.winfo_y()if record!=[self.x, self.y]:self.events.append([self.init_x, self.init_y, self.x, self.y])self.window.angle_canvas.destroy()self.init_canvas()time.sleep(0.00001)record = [self.x, self.y]self.boardlock = Truedef key(self,event):if self.checklock==0:self.checklock = 1 - self.checklockself.init_x = event.xself.init_y = event.yboardthread = threading.Thread(target=self.mouse_detector)boardthread.start()else:self.checklock = 1 - self.checklockself.boardlock = Falseself.events.append([self.init_x, self.init_y, self.x, self.y])def init_canvas(self):self.window.angle_canvas = tk.Canvas(self.window, bg='#336600')self.window.angle_canvas.place(x=150,y=50,width=700,height=300)self.window.angle_canvas.bind("<Button-1>", self.key)if self.events!=[]:if self.checklock==0:for i,item in enumerate(self.events):if i==len(self.events)-1:breakself.window.angle_canvas.create_line(item,fill='white')else:for i, item in enumerate(self.events):self.window.angle_canvas.create_line(item, fill='white')self.events = self.events[:-1]def clean(self):if self.checklock==1:returnself.window.angle_canvas.destroy()self.events = []self.init_canvas()
if __name__ == '__main__':#主函数thread = threading.Thread(target=mouse_detector)thread.start()root = tk.Tk()root.resizable(False, False)basedesk(root)root.mainloop()os._exit(0)

教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器相关推荐

  1. 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器

    温度计测量水温的过程要满足如下条件: 1.不能碰烧杯底. 2.不能碰烧杯壁. 设计一款动手实践上面过程的软件,就是接下来要完成的~ 我们先看一下效果: 如何用python制作温度计模拟器 python ...

  2. Python制作七夕表白实例项目-让你的情人心动起来

    文章目录 Python制作七夕表白实例项目-让你的情人心动起来 前言 一.记录一起走过的那些日子 二.创意代码表白 2.1.效果演示 2.2.制作步过程 2.2.1.清屏函数 2.2.2.重定位海龟的 ...

  3. Python制作简单的终端交互小游戏

    Python制作简单的终端交互小游戏 因为最近的集训课程中,老师让我们把python,java,nodejs都需要掌握,本人最常使用的是java,python许久没有用过,就想写一段逻辑来帮助自己复习 ...

  4. 教你如何用python制作平面直角坐标系模拟器 python项目小发明 【安安教具】-【数学】-【平面直角坐标系】模拟器

    平面直角坐标系和之前的数轴模拟器有异曲同工之妙,但是作为一个二维的软件,肯定是要难一些的... [安安教具]-[数学]-[数轴]模拟器 教你如何用python制作数轴模拟器 python 小项目创作_ ...

  5. 教你如何用python制作三角形模拟器 python项目小发明 【安安教具】-【数学】-【三角形】模拟器

    三角形的三个点互相连接组成了一个平面图形,我们如何用python制作一个可以展示各种三角形的软件呢? 我们先看看效果: 这个东西要如何使用呢?我们看一下视频: 三角形模拟器 可以看到,控制三角形的三个 ...

  6. 如何用python制作二力平衡模拟器 python项目小发明 【安安教具】-【物理】-【二力平衡】模拟器

    二力平衡指的是,一个物体在两个相反力的作用下保持静止或者匀速运动. 二力平衡模拟器则可以体现这一点: 二力平衡模拟器 用到的库有: from tkinter import * import tkint ...

  7. 做网页是用dw还是html,教你如何用Dreamweaver制作网页以及保存网页的方法--系统之家...

    如何用Dreamweaver(DW)制作网页并保存网页呢?我就在这里教给大家最基础的创建网页和保存网页的方法教程,希望能帮到有需要的朋友. 启动软件后,在左上角点击[文件],在下拉菜单中点击[新建]. ...

  8. 计算机excel在三维饼图改字,从图形样式、文字数据到颜色更改,教你如何用Excel制作饼形图...

    在Excel中用饼形图来展示一些数据看起来会更加直观,为了让没制作过饼形图的Excel用户了解如何制作饼形图,学习啦小编为大家整理的Excel产品使用方法,一起来看看吧! 添加饼形图 ●先在Excel ...

  9. 利用Python制作王者荣耀出装小助手,引来了老板的注意!

    导语 T_T并不玩这些游戏... 单纯来蹭个热点... 大概是因为蹭热点需要的技术含量比较低? 就这样吧~~~ 利用Python制作命令行版的王者荣耀出装小助手. Let's Go! 开发工具 Pyt ...

最新文章

  1. Python使用matplotlib可视化绘制并通过Tkinter生成按钮将可视化结果导出为pdf文件
  2. Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
  3. 知识图谱如何让智能金融“变魔术”
  4. poj2318 TOYS
  5. sublime搭建python开发环境_使用sublime搭建python开发环境
  6. 数据结构-常用的排序算法
  7. asp服务器_Asp.Net Core2.2从环境配置到应用建立
  8. python虚拟环境安装和配置_Python3安装虚拟环境virtualenvwrapper和配置
  9. jq 获取引入页面url_jqURL获取页面URL及参数
  10. [FFmpeg] Ubuntu 16.04 安装 FFmpeg
  11. Django框架(三)-- orm增删改查、Django生命周期
  12. 非极大值抑制(NMS)讲解
  13. 「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等
  14. svn的安装linux
  15. 小学-知识与能力【5】
  16. 秒懂设计模式之桥接模式(Bridge Pattern)
  17. 在单核CPU下,有必要存在多线程吗?
  18. 元数据“人行横道”MC
  19. 通过使用ZooKeeper解决单点故障理论
  20. 内部存储空间不足_手机内部存储空间不足怎么清理

热门文章

  1. 今天,大佬云集的夜幕团队正式成立了!
  2. 中国最美的十首情诗词
  3. bilibili 网页端如何关灯和开灯?
  4. android 平台马甲举报,GitHub - qq549631030/AndroidJunkCode: Android马甲包生成垃圾代码插件...
  5. 某电批锁付一颗螺丝的原理分析
  6. qq音乐获取歌曲源链接地址
  7. gen8服务器系统,gen8 服务器 bios 设置
  8. 操作系统之信号量机制
  9. 数字集成电路设计---除法运算
  10. python123数字转换_Python将汉字数字转换成阿拉伯数字的方法