2012-02-01 3 views
-1

私はツールチップの割り当てと管理に以下のスクリプトを使用しています。それは動作しますが、小さな不利益を伴います。私がツールチップを割り当てるボタンウィジェットは、ツールチップスクリプトが500ms後に実行されない限り、クリックダウンアニメーションをもはや持っていない。何か案は?可能であれば、いつでもネイティブボタンの動作を維持し、ツールチップを表示する前に500ms待機する必要があります。ボタンのアニメーションをオーバーライドしないでこのpython tkinterツールチップを実装するにはどうすればいいですか?

class ToolTip(object): 
    def __init__(self, widget): 
     self.widget = widget 
     self.tipwindow = None 
     self.id = None 
     self.x = self.y = 0 
    def showtip(self, text): 
     self.text = text 
     if self.tipwindow or not self.text: return 
     x,y,cx,cy = self.widget.bbox("insert") 
     x = x + self.widget.winfo_rootx() +15 
     y = y + cy + self.widget.winfo_rooty() +65 
     self.tipwindow = tw = Toplevel(self.widget) 
     tw.wm_overrideredirect(1) 
     tw.wm_geometry("+%d+%d"%(x,y)) 
     label = Label(tw, text=self.text, justify=LEFT,background="#ffffe0", relief=SOLID, borderwidth=1,font=("tahoma", "8", "normal")) 
     label.pack(ipadx=1) 
    def hidetip(self): 
     tw = self.tipwindow 
     self.tipwindow = None 
     if tw: tw.destroy() 

def createToolTip(self,widget,text): 
    toolTip = self.ToolTip(widget) 
    def enter(event): root.after(500,show(event)) 
    def show(event): toolTip.showtip(text) 
    def leave(event): toolTip.hidetip() 
    widget.bind('<Enter>', enter) 
    widget.bind('<Leave>', leave) 

答えて

1

コードにバグがあります。しかし、afterへの引数は、関数への参照ではなく、実際の関数呼び出しでなければなりません

def enter(event): root.after(500,show(event)) 

:あなたはこれを持っています。このように変更します。

def enter(event): root.after(500,show,event) 

何が起こっていることはこれです:あなたがroot.after(500, show(event))を行う際に、たまたま最初はshow(event)が後に呼び出す前を実行していることです。その結果(None)は後で使用され、事実上root.after(500, None)となります。これにより、GUI全体が0.5秒間スリープ状態になります。それが眠っている間、それはあなたがアニメーションを見ない理由であるすべてのイベントに応答することができません。

+0

私は、もう一度ブライアンを参照してください。今私は別の問題を抱えています.500ミリ秒以内にボタンを押して終了すると、ツールチップが表示されたままになります。どのようにそれを修正するための任意のアイデア? – Symon

+1

@サイモン:コメントは答えが正しい場所ではありません。短いバージョン:カーソルが500ms間移動した場合、ツールチップを表示しないでください。または、 ''の処理中に、保留中の「アフター」ジョブをキャンセルします。 –

+0

ヒントをありがとう、私はあなたの2番目の提案を行った。 – Symon

0
from tkinter import * 
from tkinter.tix import * 
root = Tk() 

MyButtn = Button(root, text="Hello") 
MyButtn.grid() 

ToolTp = Balloon() 
ToolTp.bind_widget(MyButtn, balloonmsg="My ToolTip example") 

root.mainloop() 
+2

答えとしてコードをダンプするのを避け、その動作とその理由を説明してください。関連するコーディング経験を持っていない人にとっては、あなたのコードは明らかではないかもしれません。 [解明、文脈を含めるようにあなたの答えを編集して、あなたの答えに何らかの制限、前提条件、単純化を言及してください。](https://stackoverflow.com/help/how-to-answer) –

関連する問題