-
Notifications
You must be signed in to change notification settings - Fork 0
/
tooltips.py
177 lines (108 loc) · 4.37 KB
/
tooltips.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
"""
WHAT IS THIS: tooltips for tkinter that follow the cursor.
HOW TO USE THIS:
- save this file as tooltips.py either in the same root as your file or in a folder
- use "from tooltips import tips" or "from foldername.tooltips import tips"
- tt=tips(*args,**kwargs)
- it can be applied to any widget, including root windows.
- you should include root.mainloop() to improve the performance of the tooltips
NECESSARY ARGUMENTS: the parent widget, i.e. the widget you want the tooltip to appear for when hovered over
OPTIONAL KEYWORD ARGUMENTS:
- text="..." : the text that the tooltip will show. supports standard text like other tkinter widgets. if not supplied, defaults to "".
- bg="..." : the background colour of the tip. supports hex values and tkinter defined colours. if not supplied, defaults to "yellow".
- fg="..." : the text colour of the tip. supports hex values and tkinter defined colours. if not supplied, defaults to "black".
- delay=0 : sets the delay in seconds between hovering and the tip appearing. supports integers. if not supplied, defaults to 0.
- state="..." : sets whether the tip should follow the cursor or not. supports "static" and "mobile". if not supplied, defaults to "mobile".
METHODS: (assuming "tt" is the name of the tooltip you defined)
- tt.configure : change an attribute of the tooltip (accepts text,bg,fg,delay,state)
- tt.destroy : destroy a tooltip so that it no longer appears
SCREENSHOTS:
- http://prntscr.com/hfzwyv
- http://prntscr.com/hfzxc3 (after the button is clicked)
"""
from tkinter import Toplevel, Message
__author__="GEO"
class tips:
"ARGS: <WIDGET> | KWARGS: text, bg, fg, delay, state"
def __init__(self,*args,**kwargs):
try:
self.parent=args[0]
except IndexError:
raise Exception("No root supplied")
try:
self.txt=kwargs["text"]
except KeyError:
self.txt=""
try:
self.bg=kwargs["bg"]
except KeyError:
self.bg="yellow"
try:
self.fg=kwargs["fg"]
except KeyError:
self.fg="black"
try:
self.delay=kwargs["delay"]*1000
except KeyError:
self.delay=0
try:
self.state=kwargs["state"]
if self.state!="static" and self.state!="mobile":
self.state="mobile"
except KeyError:
self.state="mobile"
self.tip=Toplevel()
self.tip.withdraw()
self.tip.overrideredirect(True)
self.tip.geometry("+500+500")
self.msg=Message(self.tip,text=self.txt,bg=self.bg,fg=self.fg,aspect=1000,relief="solid")
self.msg.grid()
self.parent.bind("<Enter>",lambda e:self.parent.after(self.delay,self.showtip(e)))
self.parent.bind("<Leave>",self.hidetip)
if self.state=="mobile":
self.parent.bind("<Motion>",self.movetip)
def showtip(self,event):
self.tip.deiconify()
if self.state=="static":
x,y=self.parent.winfo_rootx()+15,self.parent.winfo_rooty()+10
elif self.state=="mobile":
x,y=event.x_root+10,event.y_root+10
self.tip.geometry("+"+str(x)+"+"+str(y))
def hidetip(self,event):
self.tip.withdraw()
def movetip(self,event):
x,y=event.x_root+10,event.y_root+10
self.tip.geometry("+"+str(x)+"+"+str(y))
def configure(self,**kwargs):
try:
self.txt=kwargs["text"]
self.msg.configure(text=self.txt)
except KeyError:
pass
try:
self.bg=kwargs["bg"]
self.msg.configure(bg=self.bg)
except KeyError:
pass
try:
self.fg=kwargs["fg"]
self.msg.configure(fg=self.fg)
except KeyError:
pass
try:
self.delay=kwargs["delay"]*1000
self.parent.bind("<Enter>",lambda e:self.parent.after(self.delay,self.showtip(e)))
except KeyError:
pass
try:
self.state=kwargs["state"]
if self.state=="mobile":
self.parent.bind("<Motion>",self.movetip)
except KeyError:
pass
def destroy(self):
self.parent.unbind("<Enter>")
self.parent.unbind("<Leave>")
self.parent.unbind("<Motion>")
self.tip.destroy()
del self