Как я могу реализовать эту подсказку Python Tkinter без переопределения анимации нажатия кнопки - PullRequest
0 голосов
/ 02 февраля 2012

Я использую следующий скрипт для назначения и управления подсказками. Работает, но с небольшим недостатком. У виджетов кнопок, которым я назначаю всплывающие подсказки, больше нет анимации щелчка вниз, если сценарий всплывающей подсказки не выполняется через 500 мс. Есть идеи? Если возможно, я хочу сохранить собственное поведение кнопки в любое время И подождать 500 мс, прежде чем показывать всплывающую подсказку.

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)

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

У вас есть ошибка в вашем коде.У вас есть это:

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 голосов
/ 20 июня 2017
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()
...