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画图程序拖动鼠标画各种形状多边形功能相关推荐

  1. win10画图程序拖动鼠标画图形功能用python实现的思路

    win10画图程序本质上是一个位图处理程序.其最主要的功能是画各种图形,包括线.矩形.椭圆(圆)和各种多边形等,并将各种图形保存到位图中.线.矩形.椭圆(圆)和各种多边形都可以用一个矩形定位,这点在前 ...

  2. 用python实现win10画图程序画选择框、复制、剪切、粘贴及拖动选择框内图形或粘贴后图形到指定位置

    本文介绍用python实现win10画图程序剪贴功能的方法.win10画图程序本质上是一个位图处理程序.其最主要的功能是画各种图形,包括线.矩形.椭圆(圆)和各种多边形等,并将各种图形保存到位图中.该 ...

  3. C语言跟随鼠标画方框,JS拖动鼠标画出方框实现鼠标选区的方法

    本文实例讲述了JS拖动鼠标画出方框实现鼠标选区的方法.分享给大家供大家参考.具体如下: 相当实用的一个JS技巧,拖动鼠标可画出一个方框,可作为一个选区的功能,可以用来画流程图,设计草图什么的,也可以作 ...

  4. python设计查询余额程序_python实现监控阿里云账户余额功能

    背景 由于阿里云oss,cdn消耗钱的速度比较快,在不知道的情况下,服务就被停了,影响比较大.所以想做个监控.百度一下阿里云账户余额 api 还真有:于是开启了踩坑之路. 查阅资料创建accessKe ...

  5. 用Python做一个控制台程序实现图书管理器的简单功能,例如添加图书、查询库里的图书、删除图书、修改书籍信息、显示书籍信息,或者是借阅/归还...

    为了实现图书管理器的功能,需要考虑如下几点: 需要定义一个图书类,包含书名.作者.出版社.借阅状态.借阅人等属性,可以使用类的构造函数来初始化这些属性. 需要定义一个图书管理器类,包含一个用于存储图书 ...

  6. python定时播放音乐程序_python实现闹钟定时播放音乐功能

    自己写的闹钟,只可以播放wav格式的音频,供大家参考,具体内容如下 Python代码: import time import sys soundFile = 'sound.wav' not_execu ...

  7. html5画图程序,基于HTML5的Windows画图程序

    Windows 画图程序一直伴随着 Windows 各个版本,这个很简单,几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦.HTML5 的 Canvas 对象使在线绘图成为可能,虽然 HTM ...

  8. python画图程序有图-python画图程序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 今天做的是用python实现画图,画出你想要的图案,只要你的想象力足够丰富,以及 ...

  9. python控制软件点击_Python小程序 控制鼠标循环点击代码实例

    Python小程序 控制鼠标循环点击代码实例 这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...

最新文章

  1. Bucking the stigma (留学生请摘掉有色眼镜看社区大学)
  2. 查询oracle sql语句执行最慢和执行最多的语句!
  3. mybatis报错,找不到对应mapper文件
  4. c++对const增强 和cosnt分配内存情况
  5. dedecms sphinx 配置
  6. 做游戏怎能没有马云马化腾?
  7. kalipython图形界面_Kali入侵入门版笔记!!!
  8. 2022-2028年中国智能机床行业市场专项调研及投资前景规划报告
  9. 抖音记事本代码html,抖音记事本vbs弹窗表白代码怎么弄的?附教程
  10. 双厨狂喜!海盗船机械键盘联名石之海,一起欧拉欧拉!
  11. 合并两个有序数组——C语言
  12. Android 设备接入扫码枪,Android 设备接入扫码枪
  13. 【Java项目】社区论坛项目
  14. iTunes12.9以上 自定义铃声 无法拖入 无法添加
  15. speedpdf——PDF转PPT免费在线转换还不限制页数哦
  16. 深入了解style标签元素
  17. 亿级流量网站架构核心技术
  18. 元器件温度系数(ppm/℃)是什么?
  19. ISIS几个命令的区别
  20. 解耦、削峰、异步的理解

热门文章

  1. Python--傻瓜式安装pip
  2. css实现分页 分页符pdf打印分页
  3. 职场点评:CEO妙语批点大学生简历
  4. 销售和程序员哪个好_进销存销售软件哪个好
  5. np.arctan2(x,y)解读
  6. GreyBox官网~~
  7. 使用 Play with Docker 部署 ABT 节点 | ArcBlock 博客
  8. vue3实现video控件的h5端进度条拖拽与跳转
  9. 傅里叶级数与解调;频谱与频谱密度
  10. zigbee无线传感网实训---zigbee显示温湿度以及连接LCD开发板显示温湿度(The Eighth day)