2

我想要做的是让用户单击画布上的某个位置,然后单击其他位置并在两点之间绘制一条直线。我是 TKinter 的新手,经过一番谷歌搜索和在这里搜索后,我很难找到一个可靠的答案。

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

任何帮助将不胜感激,甚至任何可能有帮助的文章/教程的链接

4

2 回答 2

7

您唯一需要做的就是绑定"<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()

我根本不喜欢使用全局变量,将所有小部件和相关函数包装在一个类中会更干净。但是,作为一个例子,我认为这已经足够清楚了。

于 2013-02-24T04:59:59.240 回答
2

对我来说看起来很简单。

只需在此处查看有关 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()
于 2013-02-24T05:11:05.410 回答