Mercurial > code > home > repos > light9
comparison Widgets/Fadable.py @ 0:45b12307c695
Initial revision
author | drewp |
---|---|
date | Wed, 03 Jul 2002 09:37:57 +0000 |
parents | |
children | 0c619695d6c6 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:45b12307c695 |
---|---|
1 # taken from SnackMix -- now that's reusable code | |
2 from Tix import * | |
3 import time | |
4 | |
5 class Fadable: | |
6 """Fading mixin: must mix in with a Tk widget (or something that has | |
7 'after' at least) This is currently used by VolumeBox and MixerTk. | |
8 It's probably too specialized to be used elsewhere, but could possibly | |
9 work with an Entry or a Meter, I guess. | |
10 | |
11 var is a Tk variable that should be used to set and get the levels. | |
12 If use_fades is true, it will use fades to move between levels. | |
13 If key_bindings is true, it will install these keybindings: | |
14 | |
15 Press a number to fade to that amount (e.g. '5' = 50%). Also, | |
16 '`' (grave) will fade to 0 and '0' will fade to 100%. | |
17 | |
18 If mouse_bindings is true, the following mouse bindings will be | |
19 installed: Right clicking toggles muting. The mouse wheel will | |
20 raise or lower the volume. Shift-mouse wheeling will cause a more | |
21 precise volume adjustment. Control-mouse wheeling will cause a | |
22 longer fade.""" | |
23 def __init__(self, var, wheel_step=5, use_fades=1, key_bindings=1, | |
24 mouse_bindings=1): | |
25 self.use_fades = use_fades # whether increase and decrease should fade | |
26 self.wheel_step = wheel_step # amount that increase and descrease should | |
27 # change volume (by default) | |
28 | |
29 self.fade_start_level = 0 | |
30 self.fade_end_level = 0 | |
31 self.fade_start_time = 0 | |
32 self.fade_length = 1 | |
33 self.fade_step_time = 10 | |
34 self.fade_var = var | |
35 self.fading = 0 # whether a fade is in progress | |
36 | |
37 if key_bindings: | |
38 for k in range(1, 10): | |
39 self.bind("<Key-%d>" % k, | |
40 lambda evt, k=k: self.fade(k / 10.0)) | |
41 self.bind("<Key-0>", lambda evt: self.fade(100)) | |
42 self.bind("<grave>", lambda evt: self.fade(0)) | |
43 | |
44 # up / down arrows | |
45 self.bind("<Key-Up>", lambda evt: self.increase()) | |
46 self.bind("<Key-Down>", lambda evt: self.decrease()) | |
47 | |
48 if mouse_bindings: | |
49 # right mouse button toggles muting | |
50 # self.bind('<3>', lambda evt: self.toggle_mute()) | |
51 # "NOT ANY MORE!" - homer | |
52 | |
53 # mouse wheel | |
54 self.bind('<4>', lambda evt: self.increase()) | |
55 self.bind('<5>', lambda evt: self.decrease()) | |
56 | |
57 # modified mouse wheel | |
58 self.bind('<Shift-4>', lambda evt: self.increase(multiplier=0.2)) | |
59 self.bind('<Shift-5>', lambda evt: self.decrease(multiplier=0.2)) | |
60 self.bind('<Control-4>', lambda evt: self.increase(length=1)) | |
61 self.bind('<Control-5>', lambda evt: self.decrease(length=1)) | |
62 | |
63 self.last_level = 0 # used for muting | |
64 def fade(self, value, length=0.5, step_time=10): | |
65 """Fade to value in length seconds with steps every step_time | |
66 seconds""" | |
67 self.fade_start_time = time.time() | |
68 self.fade_length = length | |
69 | |
70 self.fade_start_level = self.fade_var.get() | |
71 self.fade_end_level = value | |
72 | |
73 self.fade_step_time = step_time | |
74 if not self.fading: | |
75 self.fading = 1 | |
76 self.do_fade() | |
77 def do_fade(self): | |
78 """Actually performs the fade for Fadable.fade. Shouldn't be called | |
79 directly.""" | |
80 now = time.time() | |
81 elapsed = now - self.fade_start_time | |
82 complete = elapsed / self.fade_length | |
83 complete = min(1.0, complete) | |
84 diff = self.fade_end_level - self.fade_start_level | |
85 newlevel = (complete * diff) + self.fade_start_level | |
86 self.fade_var.set(newlevel) | |
87 if complete < 1: | |
88 self.after(self.fade_step_time, self.do_fade) | |
89 else: | |
90 self.fading = 0 | |
91 def increase(self, multiplier=1, length=0.3): | |
92 """Increases the volume by multiplier * wheel_step. If use_fades is | |
93 true, it do this as a fade over length time.""" | |
94 amount = self.wheel_step * multiplier | |
95 if self.fading: | |
96 newlevel = self.fade_end_level + amount | |
97 else: | |
98 newlevel = self.fade_var.get() + amount | |
99 newlevel = min(100, newlevel) | |
100 self.set_volume(newlevel, length) | |
101 def decrease(self, multiplier=1, length=0.3): | |
102 """Descreases the volume by multiplier * wheel_step. If use_fades | |
103 is true, it do this as a fade over length time.""" | |
104 amount = self.wheel_step * multiplier | |
105 if self.fading: | |
106 newlevel = self.fade_end_level - amount | |
107 else: | |
108 newlevel = self.fade_var.get() - amount | |
109 newlevel = max(0, newlevel) | |
110 self.set_volume(newlevel, length) | |
111 def set_volume(self, newlevel, length=0.3): | |
112 """Sets the volume to newlevel, performing a fade of length if | |
113 use_fades is true.""" | |
114 if self.use_fades: | |
115 self.fade(newlevel, length=length) | |
116 else: | |
117 self.fade_var.set(newlevel) | |
118 def toggle_mute(self): | |
119 """Toggles whether the volume is being muted.""" | |
120 curlevel = self.fade_var.get() | |
121 if curlevel: | |
122 newlevel = 0 | |
123 self.last_level = curlevel | |
124 self['bg'] = 'red' # TODO: let them choose these colors | |
125 else: | |
126 newlevel = self.last_level | |
127 self['bg'] = 'lightGray' | |
128 | |
129 self.fade_var.set(newlevel) | |
130 | |
131 if __name__ == "__main__": | |
132 class SubScale(Scale, Fadable): | |
133 def __init__(self, master, *args, **kw): | |
134 self.scale_var = DoubleVar() | |
135 kw['variable'] = self.scale_var | |
136 Scale.__init__(self, master, *args, **kw) | |
137 Fadable.__init__(self, var=self.scale_var) | |
138 | |
139 root = Tk() | |
140 root.tk_focusFollowsMouse() | |
141 ss = SubScale(root, from_=100, to_=0,) | |
142 ss.pack() | |
143 mainloop() |