【问题标题】:drag an arc after creating a line tkinter创建一条线tkinter后拖动一条弧线
【发布时间】:2017-03-04 00:42:38
【问题描述】:

这是画线的代码。是否可以让用户拖动一条线使其形成一条曲线?

from tkinter import Canvas, Tk

# Image dimensions
w,h = 640,480

# Create canvas
root = Tk()
canvas = Canvas(root, width = w, height = h, bg = 'white')
canvas.pack()

def on_click(event):
    """ set starting point of the line """
    global x1, y1
    x1 = event.x
    y1 = event.y

def on_click_release(event):
    """ draw the line """
    canvas.create_line(x1, y1, event.x, event.y)

def clear_canvas(event):
    canvas.delete('all')

canvas.bind("<Button-1>", on_click) 
canvas.bind("<ButtonRelease-1>", on_click_release)
root.bind("<Key-c>", clear_canvas)

root.mainloop()

再次感谢你呜呜呜!!! :))))))

【问题讨论】:

  • 你为什么不试试看会发生什么?
  • 我做了,但没用,所以我可能做错了,所以我来这里寻求帮助......

标签: python canvas tkinter line automatic-ref-counting


【解决方案1】:

对于弧线,您需要在鼠标在屏幕上移动时跟踪它,而不仅仅是起点和终点。

下面的代码只会创建从矩形的左下角到右下角的弧线,但您可以通过更改弧线的start 角度和extent 角度来添加您想要的任何其他弧线。

from tkinter import Canvas, Tk, ARC

# Image dimensions
w,h = 640,480

# Create canvas
root = Tk()
canvas = Canvas(root, width = w, height = h, bg = 'white')
canvas.pack()

# curve points
global points
global temp_arc
points = []
temp_arc = None

def arc():
    x = [point[0] for point in points]
    y = [point[1] for point in points]

    return canvas.create_arc(x[0], y[0], x[-1], y[-1], start = 0, style = ARC, width = 2, extent = 180)

def motion(event):
    global temp_arc
    points.append([event.x, event.y])
    if temp_arc != None:
        canvas.delete(temp_arc)
    temp_arc = arc()


def on_click_release(event):
    arc()
    global points    
    points = []

def clear_canvas(event):
    canvas.delete('all')

canvas.bind("<B1-Motion>", motion)
canvas.bind("<ButtonRelease-1>", on_click_release)
root.bind("<Key-c>", clear_canvas)

root.mainloop()

【讨论】:

  • 既然开始只有一个值我只能有一种形式的弧?就像我不能同时拥有所有不同种类的弧线?就像我要创建一条线然后拖动这条线我只能以一种方式拖动它?
  • 没错,start 是创建圆弧的角度,extent 是圆弧的角度。如果您想要不同形式的弧线,您可以添加条件以根据第一个点和最后一个点更改 startextent
  • 所以开始 = (x,y) ?
  • 获得弧线开始和结束的角度非常困难(我尝试过但收效甚微),最好有一个输入框,用户可以在其中输入起始角度和范围角。
  • 如果用户可以画一条线,然后拖动以将线向不同方向弯曲呢?还是这也太难了? (对不起,如果我问了这么多问题,这是我第一年的编程,我的学校相信“自学”)
猜你喜欢
  • 2012-02-24
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多