我在下面提供了一个示例代码,我刚刚写了关于如何使用鼠标在 tkinter 画布中创建矩形。我希望这可以帮助您了解相关的程序和您需要的方法。此后,根据您的特定问题对其进行调整。希望这对您有所帮助,并向您致以最诚挚的问候。
示例代码:如何创建允许用户用鼠标绘制矩形对象的 tkinter 画布。
import tkinter as tk
class App(tk.Frame):
def __init__( self, parent):
tk.Frame.__init__(self, parent)
self._createVariables(parent)
self._createCanvas()
self._createCanvasBinding()
def _createVariables(self, parent):
self.parent = parent
self.rectx0 = 0
self.recty0 = 0
self.rectx1 = 0
self.recty1 = 0
self.rectid = None
def _createCanvas(self):
self.canvas = tk.Canvas(self.parent, width = 800, height = 400,
bg = "white" )
self.canvas.grid(row=0, column=0, sticky='nsew')
def _createCanvasBinding(self):
self.canvas.bind( "<Button-1>", self.startRect )
self.canvas.bind( "<ButtonRelease-1>", self.stopRect )
self.canvas.bind( "<B1-Motion>", self.movingRect )
def startRect(self, event):
#Translate mouse screen x0,y0 coordinates to canvas coordinates
self.rectx0 = self.canvas.canvasx(event.x)
self.recty0 = self.canvas.canvasy(event.y)
#Create rectangle
self.rectid = self.canvas.create_rectangle(
self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde")
print('Rectangle {0} started at {1} {2} {3} {4} '.
format(self.rectid, self.rectx0, self.recty0, self.rectx0,
self.recty0))
def movingRect(self, event):
#Translate mouse screen x1,y1 coordinates to canvas coordinates
self.rectx1 = self.canvas.canvasx(event.x)
self.recty1 = self.canvas.canvasy(event.y)
#Modify rectangle x1, y1 coordinates
self.canvas.coords(self.rectid, self.rectx0, self.recty0,
self.rectx1, self.recty1)
print('Rectangle x1, y1 = ', self.rectx1, self.recty1)
def stopRect(self, event):
#Translate mouse screen x1,y1 coordinates to canvas coordinates
self.rectx1 = self.canvas.canvasx(event.x)
self.recty1 = self.canvas.canvasy(event.y)
#Modify rectangle x1, y1 coordinates
self.canvas.coords(self.rectid, self.rectx0, self.recty0,
self.rectx1, self.recty1)
print('Rectangle ended')
if __name__ == "__main__":
root = tk.Tk()
root.geometry( "600x400" )
app = App(root)
root.mainloop()
使用的步骤和方法概述:
- 使用
tk.Canvas() 方法在Tk() 窗口中创建一个画布小部件
- 将鼠标事件
<Button-1>、<ButtonRelease-1> 和<B1-Motion> 及其回调绑定到tk.Canvas 小部件。
- 对于这些事件中的每一个:
3.1 使用方法.canvasx(event.x)和.canvasy(event.y)将鼠标指针屏幕x、y坐标转换为画布坐标,并将这些转换后的坐标存储在变量self.rectx0、self.recty0、self.rectx1、self.recty1中。 event.x 和event.y 提供鼠标指针屏幕坐标。
3.2 使用canvas方法.create_rectangle(x0, y0, x1, y1, option, ...)创建矩形或使用canvas方法.coords(tagOrId, x0, y0, x1, y1)修改矩形坐标。这里,x0、y0、x1、y1 表示矩形对象的左上角和右下角 x & y 画布坐标,tagOrId 表示矩形对象 ID。
3.3 仅限<Button-1>,需要将创建的矩形对象的ID存储在一个变量中。每当在 <B1-Motion> 和 <ButtonRelease-1> 期间调用 .coords() method 时,此变量都会为 tagOrId 提供值。