我在下面提供了一個示例代碼,我剛剛寫了如何在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
是關於矩形或關於圖像的問題嗎?你有沒有嘗試改變廣場一角的座標? –