Python tkinter画布动态创建.Line

Python tkinter画布动态创建.Line,python,user-interface,canvas,tkinter,Python,User Interface,Canvas,Tkinter,我想做的是让用户点击画布上的某个地方,然后点击其他地方,在两点之间画一条直线。我是TKinter的新手,在谷歌搜索了一下之后,我很难找到一个可靠的答案 按照我的想法,应该有一个onclick事件在画布上传递鼠标坐标,然后是一个onrelease事件在画布上传递这些坐标,从而在它们之间创建一条线。这一行必须是一个对象,然后我可以通过另一个按钮在某个点删除,但这是一个单独的问题 非常感谢您提供的任何帮助,甚至是指向文章/教程的任何链接,这些链接可能也会有所帮助。您只需将“和”绑定到画布: from

我想做的是让用户点击画布上的某个地方,然后点击其他地方,在两点之间画一条直线。我是TKinter的新手,在谷歌搜索了一下之后,我很难找到一个可靠的答案

按照我的想法,应该有一个onclick事件在画布上传递鼠标坐标,然后是一个onrelease事件在画布上传递这些坐标,从而在它们之间创建一条线。这一行必须是一个对象,然后我可以通过另一个按钮在某个点删除,但这是一个单独的问题


非常感谢您提供的任何帮助,甚至是指向文章/教程的任何链接,这些链接可能也会有所帮助。

您只需将
绑定到画布:

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()
从Tkinter导入Tk,画布
开始=无
def onclick_处理程序(事件):
全球启动
开始=(event.x,event.y)
def onrelease_处理程序(事件):
全球启动
如果“开始”不是“无”:
x=开始[0]
y=开始[1]
创建_行(x,y,event.x,event.y)
开始=无
master=Tk()
画布=画布(母版,宽度=200,高度=200)
canvas.bind(“,onclick\u处理程序)
canvas.bind(“,onrelease\u处理程序)
canvas.pack()
master.mainloop()

我一点也不喜欢使用全局变量,将所有小部件和相关函数封装在一个类中要干净得多。然而,作为一个例子,我认为这已经足够清楚了。

对我来说,这是一个非常直接的例子

只需在此处查看画布上的文档:

关于这里的事件:

他们只要输入一些这样的代码- 这门课甚至比一个简单的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()
从Tkinter导入画布、Tk、mainloop
w=Tk()
c=画布(w)
c、 包()
类绘制线(对象):
定义初始化(自我,画布):
self.canvas=画布
self.start\u coords=无
self.end\u coords=无
定义调用(自身、事件):
coords=event.x,event.y
如果不是自启动协调:
self.start\u coords=coords
返回
self.end_coords=coords
self.canvas.create_-line(self.start_-coords[0],
自启动协调[1],
self.end_坐标[0],
self.end_坐标[1])
self.start\u坐标=self.end\u坐标
c、 绑定(“,抽绳(c))
mainloop()

这两个答案都非常有用,但这更接近于我如何设置我的程序。谢谢你的链接,以及!我之所以将此标记为正确答案,是因为我采用了这种方法,我只是将其包装在我已经构建的类中,因此没有全局变量