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

코드에 버그가 있습니다.

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

그러나 after에 인수가 함수에 대한 참조가 아닌 실제 함수를 호출해야한다 : 당신이 있습니다. 이 그것을 변경 :

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

은 무엇 일어나고있는 것은 이것이다 : 당신이 root.after(500, show(event))을 수행 할 때, 일이 제일 먼저입니다 후 호출하기 전에 show(event) 실행 . 그 결과 (None)는 이후에 사용되어 효과적으로 root.after(500, None)이됩니다. 이로 인해 전체 GUI가 0.5 초 동안 잠자기 상태가됩니다. 잠자는 동안 애니메이션을 보지 못하는 모든 이벤트에 응답 할 수 없습니다.

+0

다시 한 번 감사드립니다. Bryan. 이제 다른 문제가 생겼습니다. 500ms 이내에 버튼을 입력하고 종료하면 툴팁이 계속 표시됩니다. 어떤 생각을 어떻게 고쳐야합니까? – Symon

+1

@Symon : 의견은 그 대답에 대한 적절한 장소가 아닙니다. 짧은 버전 : 500ms 동안 커서가 밖으로 나가면 툴팁을 표시하지 마십시오. 또는 ''처리 중에 보류중인 "after"작업을 취소하십시오. –

+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) –