我想要做的是让用户单击画布上的某个位置,然后单击其他位置并在两点之间绘制一条直线。我是 TKinter 的新手,经过一番谷歌搜索和在这里搜索后,我很难找到一个可靠的答案。
我一直在考虑它的方式,应该有一个 onclick 事件,它在画布上传递鼠标坐标,然后是一个 onrelease 事件,它在画布上传递这些坐标,从而在它们之间创建一条线。这条线必须是一个对象,然后我可以在某个时候通过另一个按钮将其删除,但这是一个单独的问题。
任何帮助将不胜感激,甚至任何可能有帮助的文章/教程的链接
我想要做的是让用户单击画布上的某个位置,然后单击其他位置并在两点之间绘制一条直线。我是 TKinter 的新手,经过一番谷歌搜索和在这里搜索后,我很难找到一个可靠的答案。
我一直在考虑它的方式,应该有一个 onclick 事件,它在画布上传递鼠标坐标,然后是一个 onrelease 事件,它在画布上传递这些坐标,从而在它们之间创建一条线。这条线必须是一个对象,然后我可以在某个时候通过另一个按钮将其删除,但这是一个单独的问题。
任何帮助将不胜感激,甚至任何可能有帮助的文章/教程的链接
您唯一需要做的就是绑定"<Button-1>"
到"<ButtonRelease-1>"
画布:
from Tkinter import Tk, Canvas
start = None
def onclick_handler(event):
global start
start = (event.x, event.y)
def onrelease_handler(event):
global start
if start is not None:
x = start[0]
y = start[1]
event.widget.create_line(x, y, event.x, event.y)
start = None
master = Tk()
canvas = Canvas(master, width=200, height=200)
canvas.bind("<Button-1>", onclick_handler)
canvas.bind("<ButtonRelease-1>", onrelease_handler)
canvas.pack()
master.mainloop()
我根本不喜欢使用全局变量,将所有小部件和相关函数包装在一个类中会更干净。但是,作为一个例子,我认为这已经足够清楚了。
对我来说看起来很简单。
只需在此处查看有关 Canvas 的文档:http: //effbot.org/tkinterbook/canvas.htm
关于这里的事件:http: //effbot.org/tkinterbook/tkinter-events-and-bindings.htm
而他们,只需输入一些这样的代码 - 该类甚至比一个简单的 hello World 更复杂 - 两个全局变量可以用于更简单的代码:
from Tkinter import Canvas, Tk, mainloop
w = Tk()
c = Canvas(w)
c.pack()
class DrawLines(object):
def __init__(self, canvas):
self.canvas = canvas
self.start_coords = None
self.end_coords = None
def __call__(self, event):
coords = event.x, event.y
if not self.start_coords:
self.start_coords = coords
return
self.end_coords = coords
self.canvas.create_line(self.start_coords[0],
self.start_coords[1],
self.end_coords[0],
self.end_coords[1])
self.start_coords = self.end_coords
c.bind("<Button-1>", DrawLines(c))
mainloop()