用Python实现win10画图程序拖动鼠标画各种形状多边形功能
win10画图程序在工具栏中有许多按钮,按钮显示的图形就是各种不同形状的多边形,见下图。单击选中某按钮,就能拖动鼠标画这种形状多边形。本文介绍用Python实现win10画图程序这个功能的方法。
所谓拖动鼠标画各种形状多边形,是在鼠标左键按下时,保存被点击处鼠标坐标为A,在画这个多边形期间A一直不变。在鼠标左键按下并移动时,得到鼠标当前坐标为B,计算机要以坐标A和B为变量,经过某公式计算得到多边形各点坐标,画出多边形。每次鼠标移动,都要删除前边所画的多边形,画出新多边形。鼠标抬起,拖动画多边形结束。这就要求编写一段程序,给定Canvas上两点坐标,能画出指定多边形。
坐标A和B可看作矩形左上角和右下角的坐标,多边形要画在这个矩形中。这个矩形如下图,左上角坐标为(x0,y0),右下角坐标为(x1,y1),矩形宽w=(x1-x0),矩形高h=(y1-y0)。矩形中的所有点坐标都可用公式(x,y)=(x0+m*w,y0+n*h)计算得到,m和n取值范围为0-1。公式中计算多边形不同顶点坐标的m和n都不相同,可把计算多边形不同顶点坐标的m和n保存到列表中,格式为:a=[[m1,n1],[m2,n2],…],列表长度为多边形的顶点数,这个列表要预先完成,不同图形有不同的列表值,即列表定义了某种形状多边形。可用字典组成多边形图形库,格式为:{图形名:该图形列表,…}。
以画菱形为例,菱形4个顶点是A、B、C、D。A点坐标=(x0+0.5w,y0+0*h);B点坐标=(x0+1*w,y0+0.5h),C点坐标=(x0+0.5w,y0+1*h),D点坐标=(x0+0*w,y0+0.5*h)。把点A、B、C、D的m和n用列表记录:a=[[0.5,0],[1,0.5],[0.5,1],[0,0.5]]。
由此可定义一个方法drawPolygon,根据给定列表和Canvas上两点坐标,即方法参数(x,y,x1,y1),可画出指定形状的图形。选择列表a,但(x,y,x1,y1)不同,画出的虽然都是菱形,但菱形的宽和高不相同。不选择列表a,而选择其它列表,画出的就不是菱形而是其它类图形,例如,选择六边形的列表,画出不同形状的六边形。方法定义如下:
a=[[0.5,0],[1,0.5],[0.5,1],[0,0.5]]
def drawPolygon(x,y,x1,y1): #(x,y)是矩形左上角坐标,(x1,y1)是右下角坐标w,h=x1-x,y1-ypoints=[]for m,n in a:points.append([x+m*w,y+n*h])cv.create_polygon(points, outline="green",fill="yellow",tags=('L'))
为了实现拖动鼠标画多边形,首先要为事件绑定事件函数如下:
cv.bind("<ButtonPress-1>",StartMove) #绑定鼠标左键按下事件
cv.bind("<ButtonRelease-1>",StopMove) #绑定鼠标左键松开事件
cv.bind("<B1-Motion>", OnMotion) #绑定鼠标左键被按下时移动鼠标事件
在鼠标左键按下事件函数StartMove中,保存点击处鼠标坐标为矩形左上角坐标,该坐标在画多边形期间一直不变。
first_x,first_y = event.x,event.y
在鼠标左键按下并移动事件函数OnMotion中,先删除前边画的多边形,然后在新的位置画多边形。
cv.delete('L')
drawPolygon(first_x,first_y,event.x,event.y) #(event.x,event.y)鼠标移动坐标
在鼠标左键抬起事件函数StopMove中,先删除前边画的多边形,然后在新的位置画多边形。还必须删除tags为’L’的实例中这个为’L’的tag。因重新画新的多边形时,还要用令tags=(‘L’),不删除就会同时操作以前所画的多边形。
cv.delete('L')
drawPolygon(first_x,first_y,event.x,event.y)
cv.dtag('L','L')
完整代码如下:
import tkinter as tk
root = tk.Tk()
root.geometry('300x300')
cv = tk.Canvas(root, height=300, width=300,bg='silver')
cv.pack()
a=[[0.5,0],[1,0.5],[0.5,1],[0,0.5]]
def drawPolygon(x,y,x1,y1):w,h=x1-x,y1-ypoints=[]for m,n in a:points.append([x+m*w,y+n*h])cv.create_polygon(points, outline = "green", fill = "yellow",tags=('L'))
def StartMove(event): global first_x,first_yfirst_x,first_y = event.x,event.y
def StopMove(event):global first_x,first_xcv.delete('L')drawPolygon(first_x,first_y,event.x,event.y)cv.dtag('L','L')
def OnMotion(event):global first_x,first_xcv.delete('L')drawPolygon(first_x,first_y,event.x,event.y)
cv.bind("<ButtonPress-1>",StartMove) #绑定鼠标左键按下事件
cv.bind("<ButtonRelease-1>",StopMove) #绑定鼠标左键松开事件
cv.bind("<B1-Motion>", OnMotion) #绑定鼠标左键被按下时移动鼠标事件
root.mainloop()
用Python实现win10画图程序拖动鼠标画各种形状多边形功能相关推荐
- win10画图程序拖动鼠标画图形功能用python实现的思路
win10画图程序本质上是一个位图处理程序.其最主要的功能是画各种图形,包括线.矩形.椭圆(圆)和各种多边形等,并将各种图形保存到位图中.线.矩形.椭圆(圆)和各种多边形都可以用一个矩形定位,这点在前 ...
- 用python实现win10画图程序画选择框、复制、剪切、粘贴及拖动选择框内图形或粘贴后图形到指定位置
本文介绍用python实现win10画图程序剪贴功能的方法.win10画图程序本质上是一个位图处理程序.其最主要的功能是画各种图形,包括线.矩形.椭圆(圆)和各种多边形等,并将各种图形保存到位图中.该 ...
- C语言跟随鼠标画方框,JS拖动鼠标画出方框实现鼠标选区的方法
本文实例讲述了JS拖动鼠标画出方框实现鼠标选区的方法.分享给大家供大家参考.具体如下: 相当实用的一个JS技巧,拖动鼠标可画出一个方框,可作为一个选区的功能,可以用来画流程图,设计草图什么的,也可以作 ...
- python设计查询余额程序_python实现监控阿里云账户余额功能
背景 由于阿里云oss,cdn消耗钱的速度比较快,在不知道的情况下,服务就被停了,影响比较大.所以想做个监控.百度一下阿里云账户余额 api 还真有:于是开启了踩坑之路. 查阅资料创建accessKe ...
- 用Python做一个控制台程序实现图书管理器的简单功能,例如添加图书、查询库里的图书、删除图书、修改书籍信息、显示书籍信息,或者是借阅/归还...
为了实现图书管理器的功能,需要考虑如下几点: 需要定义一个图书类,包含书名.作者.出版社.借阅状态.借阅人等属性,可以使用类的构造函数来初始化这些属性. 需要定义一个图书管理器类,包含一个用于存储图书 ...
- python定时播放音乐程序_python实现闹钟定时播放音乐功能
自己写的闹钟,只可以播放wav格式的音频,供大家参考,具体内容如下 Python代码: import time import sys soundFile = 'sound.wav' not_execu ...
- html5画图程序,基于HTML5的Windows画图程序
Windows 画图程序一直伴随着 Windows 各个版本,这个很简单,几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦.HTML5 的 Canvas 对象使在线绘图成为可能,虽然 HTM ...
- python画图程序有图-python画图程序
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 今天做的是用python实现画图,画出你想要的图案,只要你的想象力足够丰富,以及 ...
- python控制软件点击_Python小程序 控制鼠标循环点击代码实例
Python小程序 控制鼠标循环点击代码实例 这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...
最新文章
- Bucking the stigma (留学生请摘掉有色眼镜看社区大学)
- 查询oracle sql语句执行最慢和执行最多的语句!
- mybatis报错,找不到对应mapper文件
- c++对const增强 和cosnt分配内存情况
- dedecms sphinx 配置
- 做游戏怎能没有马云马化腾?
- kalipython图形界面_Kali入侵入门版笔记!!!
- 2022-2028年中国智能机床行业市场专项调研及投资前景规划报告
- 抖音记事本代码html,抖音记事本vbs弹窗表白代码怎么弄的?附教程
- 双厨狂喜!海盗船机械键盘联名石之海,一起欧拉欧拉!
- 合并两个有序数组——C语言
- Android 设备接入扫码枪,Android 设备接入扫码枪
- 【Java项目】社区论坛项目
- iTunes12.9以上 自定义铃声 无法拖入 无法添加
- speedpdf——PDF转PPT免费在线转换还不限制页数哦
- 深入了解style标签元素
- 亿级流量网站架构核心技术
- 元器件温度系数(ppm/℃)是什么?
- ISIS几个命令的区别
- 解耦、削峰、异步的理解