#!/usr/bin/python from __future__ import division, nested_scopes import Tkinter as tk from dmxchanedit import Levelbox import sys,os,time,atexit sys.path.append("../light8") import dmxclient import Patch import Submaster import dispatcher def persistentlevels(): """adjusts levels from subcomposer.savedlevels, if possible; and arranges to save the levels in that file upon exit""" global levels try: levels[:]=map(float,file("subcomposer.savedlevels","r").read().split()) except IOError: pass atexit.register(lambda: file("subcomposer.savedlevels","w"). write(" ".join(map(str,levels)))) def levelchanged(channel,newlevel): global lb, levels if channel>len(levels): return levels[channel-1]=max(0,min(1,float(newlevel))) lb.setlevels(levels) def savenewsub(levels,subname): leveldict={} for i,lev in zip(range(len(levels)),levels): if lev!=0: leveldict[Patch.get_channel_name(i+1)]=lev s=Submaster.Submaster(subname,leveldict) s.save() def Savebox(master,levels): f=tk.Frame(master,bd=2,relief='raised') tk.Label(f,text="Save this as:").pack(side='left') e=tk.Entry(f) e.pack(side='left',exp=1,fill='x') def cmd(): subname=e.get() savenewsub(levels,subname) print "saved new sub",subname tk.Button(f,text="Save",command=cmd).pack(side='left') return f ############################# levels=[0]*68 # levels should never get overwritten, just edited persistentlevels() root=tk.Tk() root.config(bg='black') lb=Levelbox(root) lb.pack(side='top') savebox=Savebox(root,levels) savebox.pack(side='top') # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is # the 0 element) lb.setlevels(levels) dispatcher.connect(levelchanged,"levelchanged") lastupdate=0 # time we last sent to dmx root.update() # get the windows drawn lastsent=[] # copy of levels def sendupdate(): global levels,lastupdate,lastsent dmxclient.outputlevels(levels) lastupdate=time.time() lastsent=levels[:] dispatcher.connect(sendupdate,"levelchanged") while 1: if 0: for i in range(20): # don't let Tk take all the time tk._tkinter.dooneevent() print "loop" else: root.update() if lastsent!=levels or time.time()>lastupdate+1: sendupdate() time.sleep(.01)