鱼C论坛

 找回密码
 立即注册
查看: 2699|回复: 10

[已解决]关于一个tkinter事件绑定实例遇到的问题

[复制链接]
发表于 2017-4-23 19:29:21 | 显示全部楼层 |阅读模式

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

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

x
题目是要求绘制两个可以拖动的小球,两个小球之间的距离不能小于70个像素,两个小球被一根线连接,随着拖动这根线中间会动态显示两个小球的距离的数值,先发上我的代码
  1. from tkinter import *
  2. class Circleline:
  3.      def __init__(self):
  4.           window = Tk()
  5.           #小球半径
  6.           radius = 20
  7.           #左边小球圆心坐标初始化
  8.           self.x1 = 20
  9.           self.y1 = 20
  10.           #右边小球圆心坐标初始化
  11.           self.x2 = 120
  12.           self.y2 = 50
  13.           self.canvas = Canvas(window,width=500,height=300)
  14.           self.canvas.pack()
  15.           #绘制小球
  16.           self.canvas.create_oval(self.x1-radius,self.y1-radius,self.x1+radius,self.y1+radius,fill = 'black',tags = 'ball1')
  17.           self.canvas.create_oval(self.x2-radius,self.y2-radius,self.x2+radius,self.y2+radius,fill = 'black',tags = 'ball2')
  18.           #连接小球的线以及显示距离的文本绘制
  19.           self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  20.           self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(self.getdistance()),tags = 'text')
  21.           #事件绑定:拖动两个小球时画面的变化
  22.           self.canvas.bind('<B1-Motion>',self.movemouse)
  23.           window.mainloop()

  24.      def movemouse(self,event):
  25.           #当两个小球的距离大于70时
  26.           if self.getdistance()>=70:
  27.                #当鼠标在左边小球内拖动时
  28.                if ((event.x-self.x1)**2+(event.y-self.y1)**2)**0.5<=20:
  29.                     #重新绘制左边小球、连接的线、显示距离的文本
  30.                     self.canvas.delete('ball1','line','text')
  31.                     self.x1 = event.x
  32.                     self.y1 = event.y
  33.                     self.canvas.create_oval(event.x-20,event.y-20,event.x+20,event.y+20,fill = 'black',tags = 'ball1')
  34.                     self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  35.                     self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(self.getdistance()),tags = 'text')
  36.                #当鼠标在右边小球内拖动时
  37.                if ((event.x-self.x2)**2+(event.y-self.y2)**2)**0.5<=20:
  38.                     #重新绘制右边小球、连接的线、显示距离的文本
  39.                     self.canvas.delete('ball2','line','text')
  40.                     self.x2 = event.x
  41.                     self.y2 = event.y
  42.                     self.canvas.create_oval(event.x-20,event.y-20,event.x+20,event.y+20,fill = 'black',tags = 'ball2')
  43.                     self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  44.                     self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(self.getdistance()),tags = 'text')
  45.      def getdistance(self):
  46.           #两个小球距离的计算
  47.           return round(((self.x1-self.x2)**2+(self.y1-self.y2)**2)**0.5,2)
  48.                
  49. Circleline()         
复制代码


运行的界面 图片1.png

现在遇到的问题是:

1.只要两个小球距离小于70个像素,就会卡住,不能再拖动,但是我们的初衷是想要不能将小球拖到小于70个像素的位置,往远距离拖动是不受影响的,求各位大神帮我想想办法要怎么改动
2.在我未设置 if self.getdistance()>=70:这一句时,只要我把一个小球的圆心拖到另一个圆内,两个小球就会融为一个球(囧,感觉很神奇啊),求问这是为什么呢?
最佳答案
2017-4-24 07:54:40
1、你没处理 <70 的情况。
2、拖动之前需要先选定某个单一的对象
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-24 07:54:40 | 显示全部楼层    本楼为最佳答案   
1、你没处理 <70 的情况。
2、拖动之前需要先选定某个单一的对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-24 19:57:11 | 显示全部楼层

谢谢提示,不过我实在没想到怎么设置小于70的情况,最后把对距离的判断改成了另一个球心和(event.x,event.y)的距离的判断,好像就不会出现之前的情况了,因为self.x = event.x是要比距离判断要滞后一点的,所以才会使得两个球之间距离小于70,就会造成卡住的情况。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-24 19:57:40 | 显示全部楼层
问题已经解决~


  1. from tkinter import *
  2. class Circleline:
  3.      def __init__(self):
  4.           window = Tk()
  5.           #小球半径
  6.           radius = 20
  7.           #左边小球圆心坐标初始化
  8.           self.x1 = 20
  9.           self.y1 = 20
  10.           #右边小球圆心坐标初始化
  11.           self.x2 = 120
  12.           self.y2 = 50
  13.           self.canvas = Canvas(window,width=500,height=300)
  14.           self.canvas.pack()
  15.           #绘制小球
  16.           self.canvas.create_oval(self.x1-radius,self.y1-radius,self.x1+radius,self.y1+radius,fill = 'black',tags = 'ball1')
  17.           self.canvas.create_oval(self.x2-radius,self.y2-radius,self.x2+radius,self.y2+radius,fill = 'black',tags = 'ball2')
  18.           #连接小球的线以及显示距离的文本绘制
  19.           self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  20.           self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(getdistance(self.x1,self.y1,self.x2,self.y2)),tags = 'text')
  21.           #事件绑定:拖动两个小球时画面的变化
  22.           self.canvas.bind('<B1-Motion>',self.movemouse)
  23.           window.mainloop()

  24.      def movemouse(self,event):

  25.                #当鼠标在左边小球内拖动时
  26.                if ((event.x-self.x1)**2+(event.y-self.y1)**2)**0.5<=20 and getdistance(event.x,event.y,self.x2,self.y2)>70:
  27.                     #重新绘制左边小球、连接的线、显示距离的文本
  28.                     self.canvas.delete('ball1','line','text')
  29.                     self.x1 = event.x
  30.                     self.y1 = event.y
  31.                     self.canvas.create_oval(self.x1-20,self.y1-20,self.x1+20,self.y1+20,fill = 'black',tags = 'ball1')
  32.                     self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  33.                     self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(getdistance(self.x1,self.y1,self.x2,self.y2)),tags = 'text')
  34.                #当鼠标在右边小球内拖动时
  35.                elif ((event.x-self.x2)**2+(event.y-self.y2)**2)**0.5<=20 and getdistance(event.x,event.y,self.x1,self.y1)>70:
  36.                     #重新绘制右边小球、连接的线、显示距离的文本
  37.                     self.canvas.delete('ball2','line','text')
  38.                     self.x2 = event.x
  39.                     self.y2 = event.y
  40.                     self.canvas.create_oval(self.x2-20,self.y2-20,self.x2+20,self.y2+20,fill = 'black',tags = 'ball2')
  41.                     self.canvas.create_line(self.x1,self.y1,self.x2,self.y2,tags = 'line')
  42.                     self.canvas.create_text((self.x1+self.x2)/2,(self.y2+self.y1)/2,text = str(getdistance(self.x1,self.y1,self.x2,self.y2)),tags = 'text')

  43.                
  44. def getdistance(x1,y1,x2,y2):
  45.           #两个小球距离的计算
  46.           return round(((x1-x2)**2+(y1-y2)**2)**0.5,2)
  47.                
  48. Circleline()         
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-1 20:35:25 | 显示全部楼层

回帖奖励 +2 鱼币

66
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-3 10:33:23 | 显示全部楼层

回帖奖励 +2 鱼币

厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-30 19:39:31 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-1 07:56:24 | 显示全部楼层

回帖奖励 +2 鱼币

看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-1 11:57:39 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-1 11:58:11 | 显示全部楼层

回帖奖励 +2 鱼币

可以
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-9 00:54:13 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-2 04:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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