我在下面提供了一个示例代码,我刚刚写了如何在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
self.move = False
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("<Motion>", self.movingRect)
def startRect(self, event):
self.move = True
#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.rect = self.canvas.create_rectangle(
self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde")
#Get rectangle's canvas object ID
self.rectid = self.canvas.find_closest(self.rectx0, self.recty0, halo=2)
print('Rectangle {0} started at {1} {2} {3} {4} '.
format(self.rect, self.rectx0, self.recty0, self.rectx0,
self.recty0))
def movingRect(self, event):
if self.move:
#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):
self.move = False
#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 (final)
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()
方法
- 绑定鼠标事件
<Button-1>
,<ButtonRelease-1>
和<Motion>
与他们的回调tk.Canvas
部件Tk()
窗口创建画布组件。
- 对于以下每个事件:
3.1更新或检查鼠标状态变量,即self.move。
3.2转换鼠标指针屏幕x,y坐标至帆布使用方法.canvasx(event.x)
和.canvasy(event.y)
和存储在变量self.rectx0
,self.recty0
,self.rectx1
,self.recty1
这些转换corrdinates坐标。 event.x
和event.y
提供鼠标指针屏幕坐标。
3.3使用画布方法.create_rectangle(x0, y0, x1, y1, option, ...)
创建矩形或使用画布方法.coords(tagOrId, x0, y0, x1, y1)
修改矩形坐标。这里,x0
,y0
,x1
,y1
表示矩形对象的左上角和右下角xy画布坐标,并且tagOrId
表示矩形对象ID。
3.4仅适用于<Button-1>
,需要将创建的矩形对象的ID存储在变量中。在<Motion>
和<ButtonRelease-1>
期间调用.coords() method
时,此变量将值提供给tagOrId。
很难理解你在问什么。你是否意识到要绘制一个矩形,你所要做的就是在平方的一个角的x或y坐标上添加一些额外的东西? –
我试图插入一个图像,但它不会允许我。我希望能够以各种形状和大小绘制它们。不管我做什么,他们都画成正方形。我使用的代码不仅仅是由我创建的,我只是将其修改为使用矩形而不是圆形。 – Kkheartsmak
是关于矩形或关于图像的问题吗?你有没有尝试改变广场一角的坐标? –