【问题标题】:Drawing rectangle using mouse events in Tkinter在 Tkinter 中使用鼠标事件绘制矩形
【发布时间】:2014-07-30 20:56:15
【问题描述】:

这是关于Draw rectangle on mouse click [Python]。我尝试了第一个解决方案,它运行良好。谁能告诉我,如果我想看到正在绘制的矩形,并且一旦松开鼠标按钮,矩形就会固定,因为我只能在释放按钮后才能看到绘制的矩形。

我们将不胜感激。

【问题讨论】:

    标签: python tkinter python-imaging-library drawrectangle


    【解决方案1】:

    我修改了引用问题中的代码。现在它在画布上拖动鼠标时显示矩形。画布显示莉娜图像。

    import tkinter as tk # this is in python 3.4. For python 2.x import Tkinter
    from PIL import Image, ImageTk
    
    
    
    class ExampleApp(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.x = self.y = 0
            self.canvas = tk.Canvas(self, width=512, height=512, cursor="cross")
            self.canvas.pack(side="top", fill="both", expand=True)
            self.canvas.bind("<ButtonPress-1>", self.on_button_press)
            self.canvas.bind("<B1-Motion>", self.on_move_press)
            self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
    
            self.rect = None
    
            self.start_x = None
            self.start_y = None
    
    
            self._draw_image()
    
    
        def _draw_image(self):
             self.im = Image.open('./resource/lena.jpg')
             self.tk_im = ImageTk.PhotoImage(self.im)
             self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)
    
    
    
        def on_button_press(self, event):
            # save mouse drag start position
            self.start_x = event.x
            self.start_y = event.y
    
            # create rectangle if not yet exist
            #if not self.rect:
            self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, fill="black")
    
        def on_move_press(self, event):
            curX, curY = (event.x, event.y)
    
            # expand rectangle as you drag the mouse
            self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)
    
    
    
        def on_button_release(self, event):
            pass
    
    
    if __name__ == "__main__":
        app = ExampleApp()
        app.mainloop()
    

    黑色方块绘制在图像顶​​部。希望这会有所帮助。

    【讨论】:

    • 非常感谢,它成功了。我可以在背景中保留图像而不是画布吗?
    • @Anuradha 保留图像是什么意思?如果要绘制多个矩形,只需删除 'if not self.rect:',以便它为每次鼠标按下创建矩形。
    • 不,我需要在 PIL 图像上绘制一个矩形。我对这类代码不是很熟悉,所以理解起来有点困难
    • @Anuradha 不用担心。很高兴我能帮上忙。
    • 如果没有像 self 这样的类声明,有什么方法可以工作吗?
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    相关资源
    最近更新 更多