教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器
黑板模拟器是一个多线程控制尝试,需要做到通过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 项目小发明 【安安教具】-【工具】-【黑板】模拟器相关推荐
- 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器
温度计测量水温的过程要满足如下条件: 1.不能碰烧杯底. 2.不能碰烧杯壁. 设计一款动手实践上面过程的软件,就是接下来要完成的~ 我们先看一下效果: 如何用python制作温度计模拟器 python ...
- Python制作七夕表白实例项目-让你的情人心动起来
文章目录 Python制作七夕表白实例项目-让你的情人心动起来 前言 一.记录一起走过的那些日子 二.创意代码表白 2.1.效果演示 2.2.制作步过程 2.2.1.清屏函数 2.2.2.重定位海龟的 ...
- Python制作简单的终端交互小游戏
Python制作简单的终端交互小游戏 因为最近的集训课程中,老师让我们把python,java,nodejs都需要掌握,本人最常使用的是java,python许久没有用过,就想写一段逻辑来帮助自己复习 ...
- 教你如何用python制作平面直角坐标系模拟器 python项目小发明 【安安教具】-【数学】-【平面直角坐标系】模拟器
平面直角坐标系和之前的数轴模拟器有异曲同工之妙,但是作为一个二维的软件,肯定是要难一些的... [安安教具]-[数学]-[数轴]模拟器 教你如何用python制作数轴模拟器 python 小项目创作_ ...
- 教你如何用python制作三角形模拟器 python项目小发明 【安安教具】-【数学】-【三角形】模拟器
三角形的三个点互相连接组成了一个平面图形,我们如何用python制作一个可以展示各种三角形的软件呢? 我们先看看效果: 这个东西要如何使用呢?我们看一下视频: 三角形模拟器 可以看到,控制三角形的三个 ...
- 如何用python制作二力平衡模拟器 python项目小发明 【安安教具】-【物理】-【二力平衡】模拟器
二力平衡指的是,一个物体在两个相反力的作用下保持静止或者匀速运动. 二力平衡模拟器则可以体现这一点: 二力平衡模拟器 用到的库有: from tkinter import * import tkint ...
- 做网页是用dw还是html,教你如何用Dreamweaver制作网页以及保存网页的方法--系统之家...
如何用Dreamweaver(DW)制作网页并保存网页呢?我就在这里教给大家最基础的创建网页和保存网页的方法教程,希望能帮到有需要的朋友. 启动软件后,在左上角点击[文件],在下拉菜单中点击[新建]. ...
- 计算机excel在三维饼图改字,从图形样式、文字数据到颜色更改,教你如何用Excel制作饼形图...
在Excel中用饼形图来展示一些数据看起来会更加直观,为了让没制作过饼形图的Excel用户了解如何制作饼形图,学习啦小编为大家整理的Excel产品使用方法,一起来看看吧! 添加饼形图 ●先在Excel ...
- 利用Python制作王者荣耀出装小助手,引来了老板的注意!
导语 T_T并不玩这些游戏... 单纯来蹭个热点... 大概是因为蹭热点需要的技术含量比较低? 就这样吧~~~ 利用Python制作命令行版的王者荣耀出装小助手. Let's Go! 开发工具 Pyt ...
最新文章
- Python使用matplotlib可视化绘制并通过Tkinter生成按钮将可视化结果导出为pdf文件
- Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
- 知识图谱如何让智能金融“变魔术”
- poj2318 TOYS
- sublime搭建python开发环境_使用sublime搭建python开发环境
- 数据结构-常用的排序算法
- asp服务器_Asp.Net Core2.2从环境配置到应用建立
- python虚拟环境安装和配置_Python3安装虚拟环境virtualenvwrapper和配置
- jq 获取引入页面url_jqURL获取页面URL及参数
- [FFmpeg] Ubuntu 16.04 安装 FFmpeg
- Django框架(三)-- orm增删改查、Django生命周期
- 非极大值抑制(NMS)讲解
- 「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等
- svn的安装linux
- 小学-知识与能力【5】
- 秒懂设计模式之桥接模式(Bridge Pattern)
- 在单核CPU下,有必要存在多线程吗?
- 元数据“人行横道”MC
- 通过使用ZooKeeper解决单点故障理论
- 内部存储空间不足_手机内部存储空间不足怎么清理
热门文章
- 今天,大佬云集的夜幕团队正式成立了!
- 中国最美的十首情诗词
- bilibili 网页端如何关灯和开灯?
- android 平台马甲举报,GitHub - qq549631030/AndroidJunkCode: Android马甲包生成垃圾代码插件...
- 某电批锁付一颗螺丝的原理分析
- qq音乐获取歌曲源链接地址
- gen8服务器系统,gen8 服务器 bios 设置
- 操作系统之信号量机制
- 数字集成电路设计---除法运算
- python123数字转换_Python将汉字数字转换成阿拉伯数字的方法