鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 3

关于canvas组件中设计类似画图工具的面板的例子

[复制链接]
发表于 2022-5-31 15:56:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lzb1001 于 2022-5-31 21:00 编辑

# 此例演示Canvas画布组件

from tkinter import *

root = Tk()

w = Canvas(root, width=400, height=200, background='white')
w.pack()

def paint(event):
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    w.create_oval(x1, y1, x2, y2, fill='red', width=2)

w.bind('<B1-Motion>', paint)

Label(root, text='按住鼠标左键并移动,开始绘制属于你自己的版图吧…',fg='blue', font=('青春记忆体', 12)).pack(side=BOTTOM)

root.title('Canvas组件教学示例')

mainloop()

------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------

【我的问题】

1、
x1, y1 = (event.x - 1), (event.y - 1)  
x2, y2 = (event.x + 1), (event.y + 1)   
没看懂什么意思呢?
测试后换成下面这样也可以:
x1, y1 = (event.x + 1), (event.y + 1)
x2, y2 = (event.x - 1), (event.y - 1)  

2、小甲鱼代码中fill=‘red’,但画出来的线是黑色的,
弹幕中有人说要把event.x后面的值调大就能发现了,但我试了下event.x后面的数字都改成5,但运行后拖动鼠标出来的好像是红色的点在黑色的线中,
是不是应该改成outline=‘’red?这样画出来的线才是红色的

3、
Canvas中B1-Motion表示鼠标左键,B2-Motion表示鼠标中键,B3-Motion表示鼠标右键
而教材中Tag组件中(见15.11.3中的p15_27.py举例)用Button-1表示鼠标左键,Button-2代表鼠标中键(即滚轮),Button-3代表鼠标右键

Canvas中B1-Motion、Tag组件中Button-1之间有何区别呢?

我尝试将代码中的B1-Motion替换成Button-1,但运行后按住鼠标左键并拖动,但无法画线,画布上只有点,所以B1-Motion在代码里表示鼠标左键呢,还是表示按下鼠标左键并拖动呢?

******************************

感谢大神不吝赐教,为新手解疑释惑。

赠人玫瑰,手有余香,好人一生平安!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-31 16:59:50 | 显示全部楼层
问题1:x1, y1 = (event.x - 1), (event.y - 1)  的意思就相当于:
x1 = (event.x - 1)
y1 = (event.y - 1)

问题2:效果跟你一样!


不过除了你的问题以外我还有另一个问题,就是用这个程序画出来的线不够连续。感觉都是离散的点,除非移动的非常慢。不知道怎么解决?有没有什么采样频率之类的参数?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-31 22:08:37 | 显示全部楼层
或许我们很多人都喜欢"一下子上五楼"吧(包括我自己)。。   
常常呢,在没搞明白必要的原理之前,就试图模仿或"借鉴"别人的代码,
殊不知 或许连最基本的官方文档和例子,自己都不会找,又或者 找到了也没仔细看。。

提两点吧:
  1. 要画的 下一个点 x, y 出现在哪,取决于 每次事件循环 所检测到的你的鼠标的 移动偏移量,以及你自定义的偏移量。
  2. 这里其实是用画"小椭圆"的方法 来当做 画下一个点(但椭圆和点,是不同的)。
     create_oval() 方法,还有一个 outline 参数,可设置 轮廓线 的颜色(默认为black),width则是轮廓线的粗细,fill 只是设置椭圆内的填充色。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-31 22:50:15 | 显示全部楼层
阿奇_o 发表于 2022-5-31 22:08
或许我们很多人都喜欢"一下子上五楼"吧(包括我自己)。。   
常常呢,在没搞明白必要的原理之前,就试图 ...

你的意思是:(event.x - 1)、(event.y - 1)、(event.x + 1)、 (event.y + 1)这些是指鼠标的 移动偏移量吗?

为什么用1,不用其他数字?

我看不少人反映这个程序画出来的线不够连续。感觉都是离散的点,是不是因为点和点之间的距离数值(即数字1)太大,导致间隔大,所以看起来不连续?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 01:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表