我想让用户点击画布上的某个地方,然后点击其他地方,在两点之间画一条直线。我是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世界还要复杂-对于更简单的代码,有两个全局变量:
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()