簡體   English   中英

如何在Tkinter中的畫布項目上實現鼠標懸停回調?

[英]How to implement a mouse hovering callback on canvas items in tkinter?

我使用下面的代碼在互聯網上找到以下代碼,以在python中實現鼠標懸停操作:

from tkinter import *
import numpy as np

class rect:
    def __init__(self, root):
        self.root = root
        self.size = IntVar()
        self.canvas = Canvas(self.root, width=800, height=300)
        self.scale = Scale(self.root, orient=HORIZONTAL, from_=3, to=20, tickinterval=1, variable=self.size)
        self.scale.bind('<ButtonRelease>', self.show)
        self.canvas.bind('<Motion>', self.motion)
        self.board = []
        self.array = np.zeros((self.scale.get(),self.scale.get())).tolist()
        self.canvas.pack()
        self.scale.pack()

    def motion(self,event):
        if self.canvas.find_withtag(CURRENT):
            current_color = self.canvas.itemcget(CURRENT, 'fill')
            self.canvas.itemconfig(CURRENT, fill="cyan")
            self.canvas.update_idletasks()
            self.canvas.after(150)
            self.canvas.itemconfig(CURRENT, fill=current_color)

    def show(self,event):
        self.canvas.delete('all')
        x = 50
        y = 50
        row = []
        self.board.clear()
        for i in range(self.scale.get()):
            row = []
            for j in range(self.scale.get()):
                rectangle = self.canvas.create_rectangle(x, y, x + 50, y + 50, fill='red')
                x += 50
                row.append(rectangle)
            x -= j*50
            y +=50
            self.board.append(row)
        print(self.board)

root = Tk()
a = rect(root)
root.mainloop()

執行的問題是項目的顏色僅在有限的時間內變為藍色。

每當進入畫布區域時,我都需要更改畫布中每個項目的顏色,並保持藍色直到鼠標離開該項目。

您可以在創建矩形時傳遞參數activefill

來自effboot.org

填充顏​​色(當與填充不同時),將鼠標指針移到項目上時使用。

為此,請替換:

rectangle = self.canvas.create_rectangle(x, y, x + 50, y + 50, fill='red')

通過:

rectangle = self.canvas.create_rectangle(x, y, x + 50, y + 50, fill='red', activefill='cyan')

這樣就無需將Motion綁定到畫布,也使代碼明顯縮短了:

from tkinter import *
import numpy as np

class rect:
    def __init__(self, root):
        self.root = root
        self.size = IntVar()
        self.canvas = Canvas(self.root, width=800, height=300)
        self.scale = Scale(self.root, orient=HORIZONTAL, from_=3, to=20, tickinterval=1, variable=self.size)
        self.scale.bind('<ButtonRelease>', self.show)
        self.board = []
        self.array = np.zeros((self.scale.get(),self.scale.get())).tolist()
        self.canvas.pack()
        self.scale.pack()

    def show(self,event):
        self.canvas.delete('all')
        x = 50
        y = 50
        row = []
        self.board.clear()
        for i in range(self.scale.get()):
            row = []
            for j in range(self.scale.get()):
                rectangle = self.canvas.create_rectangle(x, y, x + 50, y + 50, fill='red', activefill='cyan')
                x += 50
                row.append(rectangle)
            x -= j*50
            y +=50
            self.board.append(row)
        print(self.board)

root = Tk()
a = rect(root)
root.mainloop()

我更改了motion方法,並向__init__方法添加了self.last = None

from tkinter import *
import numpy as np

class rect:
    def __init__(self, root):
        self.root = root
        self.size = IntVar()
        self.canvas = Canvas(self.root, width=800, height=300)
        self.scale = Scale(self.root, orient=HORIZONTAL, from_=3, to=20, tickinterval=1, variable=self.size)
        self.scale.bind('<ButtonRelease>', self.show)
        self.canvas.bind('<Motion>', self.motion)
        self.board = []
        self.array = np.zeros((self.scale.get(),self.scale.get())).tolist()
        self.canvas.pack()
        self.scale.pack()
        self.last = None

    def motion(self, event):
        temp = self.canvas.find_withtag(CURRENT)
        if temp == self.last:
            self.canvas.itemconfig(CURRENT, fill="cyan")
            self.canvas.update_idletasks()
        else:
            self.canvas.itemconfig(self.last, fill="red")
        self.last = temp

    def show(self,event):
        self.canvas.delete('all')
        x = 50
        y = 50
        row = []
        self.board.clear()
        for i in range(self.scale.get()):
            row = []
            for j in range(self.scale.get()):
                rectangle = self.canvas.create_rectangle(x, y, x + 50, y + 50, fill='red')
                x += 50
                row.append(rectangle)
            x -= j*50
            y +=50
            self.board.append(row)
        print(self.board)

root = Tk()
a = rect(root)
root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM