2016-08-03 8 views
2

私はPythonでマウスホバリング動作を実現するために、インターネット上で見出され、下のコードを使用する:tkinterのキャンバス・アイテムにマウス・ホバー・コールバックを実装する方法は?

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() 

実行に伴う問題は、限られた時間のために、青色のアイテムの色が変化することです。

ゾーンに入るたびにキャンバス内の各アイテムの色を変更し、マウスがアイテムから離れるまで青色のままにする必要があります。

+0

'event.widget.find_closest(event.x、event.y)'がインデックスを返しましたランダムに作成する場合は、多くの痛みを持っています。 – dsgdfg

答えて

0

私はmotion方法を変更し、__init__方法にself.last = Noneを追加しました:あなたの四角形を作成するときは、引数を渡すことができactivefill

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() 
3

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をバインドする必要がなくなり、また、コードnoticebly短くなります:

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() 
+0

ありがとうございました。それは本当にクールでした。私のコードを多く最適化しました。 –

関連する問題