IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> (有源代码)python项目小发明 教你如何用python制作黑板模拟器 【安安教具】-【工具】-【黑板】模拟器 -> 正文阅读

[Python知识库](有源代码)python项目小发明 教你如何用python制作黑板模拟器 【安安教具】-【工具】-【黑板】模拟器

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

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

首先展示功能页面:

?展示一下使用效果:

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

接下来讲解其实现原理:

前端代码:

class basedesk():#底板
    def __init__(self, master):
        self.master = master
        self.master.title("黑板模拟器")
        self.master.configure(bg='#B1FFF9')
        self.master.geometry("1000x600")
        mainwindow(self.master)
class mainwindow():#主界面
    def __init__(self, master):
        self.master = master
        self.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 = master
        self.init_x=None
        self.init_y=None
        self.events=[]
        self.boardlock=True
        self.checklock=0
        self.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_POS
    hm = pyHook.HookManager()
    hm.MouseAll = onMouseEvent
    while True:
        MOUSE_POS=list(PyMouse().position())
        time.sleep(0.02)

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

点击后鼠标跟踪函数:

    def mouse_detector(self):
        global MOUSE_POS
        self.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.checklock
            self.init_x = event.x
            self.init_y = event.y
            boardthread = threading.Thread(target=self.mouse_detector)
            boardthread.start()
        else:
            self.checklock = 1 - self.checklock
            self.boardlock = False
            self.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:
                        break
                    self.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:
            return
        self.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_POS
    hm = pyHook.HookManager()
    hm.MouseAll = onMouseEvent
    while True:
        MOUSE_POS=list(PyMouse().position())
        time.sleep(0.02)
class basedesk():#底板
    def __init__(self, master):
        self.master = master
        self.master.title("黑板模拟器")
        self.master.configure(bg='#B1FFF9')
        self.master.geometry("1000x600")
        mainwindow(self.master)
class mainwindow():#主界面
    def __init__(self, master):
        self.master = master
        self.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 = master
        self.init_x=None
        self.init_y=None
        self.events=[]
        self.boardlock=True
        self.checklock=0
        self.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_POS
        self.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
    def key(self,event):
        if self.checklock==0:
            self.checklock = 1 - self.checklock
            self.init_x = event.x
            self.init_y = event.y
            boardthread = threading.Thread(target=self.mouse_detector)
            boardthread.start()
        else:
            self.checklock = 1 - self.checklock
            self.boardlock = False
            self.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:
                        break
                    self.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:
            return
        self.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中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:41:53  更:2022-02-05 21:44:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:18:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码