Mercurial > code > home > repos > light9
annotate flax/Subcomposer.py @ 148:d6252880a6fc
after the mega merge -- now has a dummy mode
author | dmcc |
---|---|
date | Sun, 06 Jul 2003 14:05:33 +0000 |
parents | 6a1f4becb1db |
children | c31601504358 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 | |
3 from __future__ import division, nested_scopes | |
4 import Tkinter as tk | |
5 from dmxchanedit import Levelbox | |
6 import sys,os,time,atexit | |
7 sys.path.append("../light8") | |
8 import dmxclient | |
9 import Patch | |
10 import Submaster | |
11 | |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
12 import dispatcher |
0 | 13 |
14 class Subcomposer(tk.Frame): | |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
15 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=68): |
0 | 16 tk.Frame.__init__(self, master, bg='black') |
17 self.dmxdummy = dmxdummy | |
18 self.numchannels = numchannels | |
19 | |
20 self.levels = [0]*68 # levels should never get overwritten, just edited | |
21 | |
22 self.levelbox = Levelbox(self) | |
23 self.levelbox.pack(side='top') | |
24 # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is | |
25 # the 0 element) | |
26 self.levelbox.setlevels(self.levels) | |
27 | |
28 self.savebox = Savebox(self, self.levels, cmd=self.savenewsub) | |
29 self.savebox.pack(side='top') | |
30 | |
31 self.loadbox = Savebox(self, self.levels, verb="Load", cmd=self.loadsub) | |
32 self.loadbox.pack(side='top') | |
33 | |
34 def alltozero(): | |
35 self.set_levels([0] * self.numchannels) | |
36 dispatcher.send("levelchanged") | |
37 | |
147 | 38 tk.Button(self, text="all to zero", command=alltozero, |
39 fg='white').pack(side='top') | |
0 | 40 |
41 dispatcher.connect(self.levelchanged,"levelchanged") | |
42 dispatcher.connect(self.sendupdate,"levelchanged") | |
43 | |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
44 self.persistentlevels() |
0 | 45 |
46 self.lastupdate=0 # time we last sent to dmx | |
47 | |
48 self.lastsent=[] # copy of levels | |
49 | |
50 def persistentlevels(self): | |
51 """adjusts levels from subcomposer.savedlevels, if possible; and | |
52 arranges to save the levels in that file upon exit""" | |
53 self.load_levels() | |
54 atexit.register(self.save_levels) | |
55 def save_levels(self, *args): | |
56 levelfile = file("subcomposer.savedlevels","w") | |
57 levelfile.write(" ".join(map(str, self.levels))) | |
58 def load_levels(self): | |
59 try: | |
60 levelfile = file("subcomposer.savedlevels","r") | |
61 levels = map(float, levelfile.read().split()) | |
62 self.set_levels(levels) | |
63 except IOError: | |
64 pass | |
65 def levelchanged(self, channel=None, newlevel=None): | |
66 if channel is not None and newlevel is not None: | |
67 if channel>len(self.levels): | |
68 return | |
69 self.levels[channel-1]=max(0,min(1,float(newlevel))) | |
70 self.levelbox.setlevels(self.levels) | |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
71 def savenewsub(self, subname): |
0 | 72 leveldict={} |
73 for i,lev in zip(range(len(self.levels)),self.levels): | |
74 if lev!=0: | |
75 leveldict[Patch.get_channel_name(i+1)]=lev | |
76 | |
77 s=Submaster.Submaster(subname,leveldict) | |
78 s.save() | |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
79 def loadsub(self, subname): |
0 | 80 """puts a sub into the levels, replacing old level values""" |
81 s=Submaster.Submasters().get_sub_by_name(subname) | |
82 self.levels[:]=[0]*68 | |
83 self.levels[:]=s.get_dmx_list() | |
84 dispatcher.send("levelchanged") | |
85 def sendupdate(self): | |
86 if not self.dmxdummy: | |
87 dmxclient.outputlevels(self.levels) | |
88 self.lastupdate = time.time() | |
89 self.lastsent = self.levels[:] | |
90 def considersendupdate(self, use_after_loop=0): | |
91 """If use_after_loop is true, it is the period of the after loop.""" | |
92 if self.lastsent != self.levels or time.time() > self.lastupdate + 1: | |
93 self.sendupdate() | |
94 if use_after_loop: | |
95 self.after(use_after_loop, self.considersendupdate, use_after_loop) | |
96 def set_levels(self, levels): | |
97 self.levels[:] = levels | |
98 dispatcher.send("levelchanged") | |
99 | |
100 def Savebox(master, levels, verb="Save", cmd=None): | |
101 f=tk.Frame(master,bd=2,relief='raised') | |
147 | 102 tk.Label(f,text="Sub name:",fg='white').pack(side='left') |
103 e=tk.Entry(f,fg='white') | |
0 | 104 e.pack(side='left',exp=1,fill='x') |
105 def cb(*args): | |
106 subname=e.get() | |
107 cmd(levels,subname) | |
108 print "sub",verb,subname | |
109 e.bind("<Return>",cb) | |
147 | 110 tk.Button(f,text=verb,command=cb,fg='white').pack(side='left') |
0 | 111 return f |
112 | |
113 ############################# | |
114 | |
115 if __name__ == "__main__": | |
116 root=tk.Tk() | |
117 root.config(bg='black') | |
147 | 118 root.tk_setPalette("#004633") |
0 | 119 |
144
f433e95f2e42
subcomposer is now a module. You can still run it from the command
dmcc
parents:
0
diff
changeset
|
120 sc = Subcomposer(root, dmxdummy=1) |
0 | 121 sc.pack() |
122 | |
123 while 1: | |
124 if 0: | |
125 for i in range(20): # don't let Tk take all the time | |
126 tk._tkinter.dooneevent() | |
127 print "loop" | |
128 else: | |
129 root.update() | |
130 | |
131 sc.considersendupdate() | |
132 time.sleep(.01) |