2013-02-24 237 views
1

我想要做的是让用户点击画布上的某个地方,然后点击其他地方,并在两点之间画一条直线。我是TKinter的新手,经过一些Google搜索和搜索后,我无法找到一个坚实的答案。Python tkinter画布动态Create.Line

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

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

回答

5

你必须做的唯一的事情是结合"<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() 

我不喜欢使用全局变量,它将所有小部件和相关函数封装在一个类中更加清晰。但是,作为一个例子,我认为这是很清楚的。

+0

非常明确,谢谢! – user2103768 2013-02-26 15:54:52

+0

我把这个标记为正确的答案,因为我采取了这种方法,我只是将它包装在课程中,我已经建立了,因此没有全局变量 – user2103768 2013-02-27 15:16:11

1

看起来很漂亮,对我来说是明智之举。

这里只是检查画布的文档: http://effbot.org/tkinterbook/canvas.htm

而且这里的事件: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

而且他们,只需键入像这样的代码 - 类甚至比一个sinple更复杂你好世界 - 两个全局变量会做简单的代码:

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() 
+0

这两个答案都非常有帮助,但这更接近我如何设置我的程序。感谢您的链接! – user2103768 2013-02-26 15:54:35