我想問一下如何檢測Python中的標簽tkinter.Canvas()。我已經使用一些基本的畫布物件設定了一個示例程式,并且所有這些物件都已分配給某個標簽。如果我單擊物件但不知道如何操作,我想要的是獲取該標簽值。
例如,當我有這個代碼時:
import tkinter
canvas = tkinter.Canvas(width=800, height=400)
canvas.pack()
canvas.create_line(20, 100, 150, 350, tags="lines")
canvas.create_line(50, 20, 300, 20, tags="lines")
canvas.create_oval(200, 250, 300, 350, fill="yellow", tags="ovals")
canvas.create_oval(400, 250, 500, 350, fill="blue", tags="ovals")
for j in range(4):
for i in range(10):
canvas.create_rectangle(i * 70 10, j * 60 10, i * 70 60, j * 60 50, fill="lightblue", tags=f"square_{j}_{i}")
def click(coords):
print(coords.x, coords.y)
canvas.bind("<Button-1>", click)
我想獲得這些值,如lines,ovals,square_5_4,square_7_1等沒有人有一個想法如何做到這一點嗎?哦:)
uj5u.com熱心網友回復:
您無需遍歷所有專案即可獲取畫布專案的標簽。畫布上被點擊的任何專案都被分配了"current"標簽。
您只需要使用canvas.find_withtagwithcanvas.gettags或"current"直接傳遞給gettags它,它就會回傳與畫布專案關聯的所有標簽。
import tkinter
canvas = tkinter.Canvas(width=800, height=400)
canvas.pack()
canvas.create_line(20, 100, 150, 350, tags="lines")
canvas.create_oval(400, 250, 500, 350, fill="blue", tags="ovals")
for j in range(4):
for i in range(10):
canvas.create_rectangle(i * 70 10, j * 60 10, i * 70 60, j * 60 50, fill="lightblue", tags=f"square_{j}_{i}")
def click(event):
#currently_clicked = canvas.find_withtag("current")
#if currently_clicked:
print(canvas.gettags("current")) # the first index will contain your desired output
canvas.bind("<Button-1>", click)
canvas.mainloop()
uj5u.com熱心網友回復:
您可以遍歷畫布上的所有專案 ID,獲取它們的標簽并將函式系結到單擊該物件(如果您需要for畫布上的所有物件(在回圈之前創建)來執行此操作):
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=800, height=400)
canvas.pack()
canvas.create_line(20, 100, 150, 350, tags="lines")
canvas.create_line(50, 20, 300, 20, tags="lines")
canvas.create_oval(200, 250, 300, 350, fill="yellow", tags="ovals")
canvas.create_oval(400, 250, 500, 350, fill="blue", tags="ovals")
for j in range(4):
for i in range(10):
canvas.create_rectangle(i * 70 10, j * 60 10, i * 70 60, j * 60 50, fill="lightblue", tags=f"square_{j}_{i}")
# loop over all items on the canvas, get their first tag (for simplicity) and bind that tag
# to clicking on the object and make that call the function that will print the tag name
# use a default value so that the correct tag is printed
for item_id in canvas.find_all():
tag = canvas.gettags(item_id)[0]
canvas.tag_bind(tag, '<Button-1>', lambda _, t=tag: print(t))
root.mainloop()
uj5u.com熱心網友回復:
正如@Matiiss在評論中所建議的那樣,您可以使用Canvas物件的tag_bind()方法將回呼函式系結到特定事件,例如按鈕 1 單擊它們。下面的代碼——基于你的——說明了這樣的事情是如何完成的。
它創建匿名lambda函式,呼叫通用pick()點擊事件處理函式并將原始事件物件以及當前與該物件關聯的標記名稱傳遞給它。
import tkinter
def pick(event, tag):
print(f'tag: {tag!r}, coords: {event.x}, {event.y}')
canvas = tkinter.Canvas(width=800, height=400)
canvas.pack()
canvas.create_line(20, 100, 150, 350, tags='lines')
canvas.create_line(50, 20, 300, 20, tags='lines')
canvas.tag_bind('lines', '<Button-1>', lambda event: pick(event, 'lines'))
canvas.create_oval(200, 250, 300, 350, fill='yellow', tags='ovals')
canvas.create_oval(400, 250, 500, 350, fill='blue', tags='ovals')
canvas.tag_bind('ovals', '<Button-1>', lambda event: pick(event, 'ovals'))
for j in range(4):
for i in range(10):
tag = f'square_{j}_{i}'
canvas.create_rectangle(i*70 10, j*60 10, i*70 60, j*60 50,
fill='lightblue', tags=tag)
canvas.tag_bind(tag, '<Button-1>', lambda event, tag=tag: pick(event, tag))
tkinter.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393609.html
