【问题标题】:Python tkinter Canvas Dynamic Create.LinePython tkinter Canvas 动态 Create.Line
【发布时间】:2013-02-24 04:19:42
【问题描述】:

我想要做的是让用户点击画布上的某处,然后点击其他地方并在两点之间画一条直线。我是 TKinter 的新手,经过一些谷歌搜索和搜索后,我无法找到可靠的答案。

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

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

【问题讨论】:

    标签: python user-interface canvas tkinter


    【解决方案1】:

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

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

    【讨论】:

    • 我将其标记为正确答案,因为我采用了这种方法,我只是将它包装在我已经构建的类中,因此没有全局变量
    【解决方案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()
    

    【讨论】:

    • 两个答案都非常有帮助,但这更接近我设置程序的方式。也感谢您的链接!
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2013-02-22
    相关资源
    最近更新 更多