用户界面-Python tkinter Canvas Dynamic Create.Line



我想让用户点击画布上的某个地方,然后点击其他地方,在两点之间画一条直线。我是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()

最新更新