Package VisionEgg :: Package PyroApps :: Module EPhysGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.EPhysGUI

   1  #!/usr/bin/env python 
   2  # 
   3  # The Vision Egg: EPhysGUI 
   4  # 
   5  # Copyright (C) 2001-2004 Andrew Straw. 
   6  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd 
   7  # Copyright (C) 2004, 2008 California Institute of Technology 
   8  # 
   9  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  10  # URL: <http://www.visionegg.org/> 
  11  # 
  12  # Distributed under the terms of the GNU Lesser General Public License 
  13  # (LGPL). See LICENSE.TXT that came with this file. 
  14  # 
  15  # $Id: EPhysGUI.py 1455 2008-06-07 15:42:14Z astraw $ 
  16   
  17  import VisionEgg 
  18  __version__ = VisionEgg.release_name 
  19  __cvs__ = '$Revision: 1455 $'.split()[1] 
  20  __date__ = ' '.join('$Date: 2008-06-07 08:42:14 -0700 (Sat, 07 Jun 2008) $'.split()[1:3]) 
  21  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
  22   
  23  import sys, socket, re, time, string, types, os 
  24  import parser, symbol, token, compiler 
  25  import pickle, random, math, threading 
  26  import Tkinter, tkMessageBox, tkSimpleDialog, tkFileDialog 
  27  import StringIO 
  28  import Pyro 
  29  import numpy 
  30   
  31  import VisionEgg 
  32  import VisionEgg.PyroClient 
  33  import VisionEgg.PyroApps.ScreenPositionGUI 
  34  import VisionEgg.GUI 
  35  import VisionEgg.ParameterTypes as ve_types 
  36   
  37  # Add your client modules here 
  38  import VisionEgg.PyroApps.TargetGUI 
  39  import VisionEgg.PyroApps.MouseTargetGUI 
  40  import VisionEgg.PyroApps.FlatGratingGUI 
  41  import VisionEgg.PyroApps.SphereGratingGUI 
  42  import VisionEgg.PyroApps.SpinningDrumGUI 
  43  import VisionEgg.PyroApps.GridGUI 
  44  import VisionEgg.PyroApps.ColorCalGUI 
  45   
  46  import VisionEgg.PyroApps.DropinGUI 
  47  import VisionEgg.PyroApps.AST_ext as AST_ext 
  48  import VisionEgg.PyroApps.VarTypes as VarTypes 
  49   
  50  client_list = [] 
  51  client_list.extend( VisionEgg.PyroApps.TargetGUI.get_control_list() ) 
  52  client_list.extend( VisionEgg.PyroApps.MouseTargetGUI.get_control_list() ) 
  53  client_list.extend( VisionEgg.PyroApps.FlatGratingGUI.get_control_list() ) 
  54  client_list.extend( VisionEgg.PyroApps.SphereGratingGUI.get_control_list() ) 
  55  client_list.extend( VisionEgg.PyroApps.SpinningDrumGUI.get_control_list() ) 
  56  client_list.extend( VisionEgg.PyroApps.GridGUI.get_control_list() ) 
  57  client_list.extend( VisionEgg.PyroApps.ColorCalGUI.get_control_list() ) 
  58  client_list.extend( VisionEgg.PyroApps.DropinGUI.get_control_list() ) 
  59   
60 -class ContainedObjectBase:
61 """Base class to encapsulate objects, provides useful methods when used in GUI"""
62 - def __init__(self):
63 raise RuntimeError("Abstract base class!")
64 - def get_str_30(self):
65 return "**** this is a generic str_30 ****"
66 - def get_contained(self):
67 return self.contained
68 header = "unknown parameters"
69
70 -class ScrollListFrame(Tkinter.Frame):
71 - def __init__(self,master=None,list_of_contained_objects=None,contained_objectbject_maker=None, 72 container_class=ContainedObjectBase, 73 **cnf):
74 Tkinter.Frame.__init__(self, master, **cnf) 75 if list_of_contained_objects is None: 76 self.list = [] 77 else: 78 self.list = list_of_contained_objects 79 self.container_class = container_class 80 81 # allow column to expand 82 self.columnconfigure(0,weight=1) 83 84 # The frame that has the list and the vscroll 85 self.frame = Tkinter.Frame(self,borderwidth=2) 86 self.frame.grid(row=0,sticky="nwes") 87 88 # allow column to expand 89 self.frame.columnconfigure(0,weight=1) 90 91 self.frame.vscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.VERTICAL) 92 self.frame.hscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.HORIZONTAL) 93 self.frame.title = Tkinter.Listbox( 94 self.frame, 95 relief=Tkinter.FLAT, 96 font=('courier',10,'bold'), 97 height=1, 98 # selectbackground='#eed5b7', 99 # selectborderwidth=0, 100 # selectmode=None, 101 exportselection=0) 102 self.frame.title.insert(Tkinter.END, self.container_class.header) 103 self.frame.list = Tkinter.Listbox( 104 self.frame, 105 relief=Tkinter.SUNKEN, 106 font=('courier',10,'normal'), 107 width=40, height=10, 108 selectbackground='#eed5b7', 109 selectborderwidth=0, 110 selectmode=Tkinter.BROWSE, 111 xscroll=self.frame.hscroll.set, 112 yscroll=self.frame.vscroll.set, 113 exportselection=0) 114 115 self.frame.hscroll['command'] = self.delegate_hscroll 116 self.frame.hscroll.grid(row=3,column=0,sticky='we') 117 self.frame.vscroll['command'] = self.frame.list.yview 118 self.frame.vscroll.grid(row=2,column=1,sticky='ns') 119 self.frame.title.grid(row=1,column=0,ipady=0,pady=0,sticky='we') 120 self.frame.list.grid(row=2,column=0,sticky='nwes') 121 self.frame.list.bind('<Double-Button-1>',self.edit_selected) 122 123 # The buttons on bottom 124 self.bar = Tkinter.Frame(self,borderwidth=2) 125 self.bar.grid(row=1,sticky="we") 126 self.bar.add = Tkinter.Button(self.bar,text='Add...',command=self.add_new) 127 self.bar.add.grid(row=0,column=0,sticky='we') 128 self.bar.edit = Tkinter.Button(self.bar,text='Edit...',command=self.edit_selected) 129 self.bar.edit.grid(row=0,column=1,sticky='we') 130 self.bar.remove = Tkinter.Button(self.bar,text='Remove',command=self.remove_selected) 131 self.bar.remove.grid(row=0,column=2,sticky='we') 132 self.bar.move_up = Tkinter.Button(self.bar,text='Up',command=self.move_selected_up) 133 self.bar.move_up.grid(row=0,column=3,sticky='we') 134 self.bar.move_down = Tkinter.Button(self.bar,text='Down',command=self.move_selected_down) 135 self.bar.move_down.grid(row=0,column=4,sticky='we') 136 self.bar.tk_menuBar(self.bar.add,self.bar.remove) 137 #Lachie- My bar for setting parent 138 self.bar.merge = Tkinter.Button(self.bar,text='Merge/Unmerge',command=self.make_merge) 139 self.bar.merge.grid(row=0,column=5,sticky='we') 140 self.bar.tk_menuBar(self.bar.add,self.bar.remove) 141 self.update_now()
142
143 - def list2D_coordinates(self, main_index, main_list):
144 # This is a function for finding the 2-d 145 # list coordinates of an element which may be inside a 146 # list-nested-list. 147 # eg. if x = [[e, e, e], [e], [e, e]] 148 # Then the coordinates of the element at index 4 is: (2, 0) 149 # 150 # Initialization: 151 i = -1 152 j = -1 153 element_count = 0 154 # Main body: 155 for nested_list in main_list: 156 j = -1 157 i = i + 1 158 for element in nested_list: 159 j = j + 1 160 element_count = element_count + 1 161 if (element_count - 1) == main_index: 162 return [i, j] 163 # Unsuccessful exit: 164 return [-1, -1]
165
166 - def delegate_hscroll(self,*args,**kw):
167 self.frame.title.xview(*args,**kw) 168 self.frame.list.xview(*args,**kw)
169
170 - def get_list_uncontained(self):
171 results = [] 172 for contained_object_item in self.list: 173 #results.append( contained_object_item.get_contained() ) 174 results.append( contained_object_item ) 175 return results
176
177 - def update_now(self):
178 self.frame.list.delete(0,Tkinter.END) 179 max_len = 0 180 for loop_container in self.list: 181 for loop in loop_container: 182 item_str_30 = loop.get_str_30() 183 max_len = max(max_len,len(item_str_30)) 184 self.frame.list.insert(Tkinter.END,item_str_30) 185 self.frame.list.insert(Tkinter.END,"") 186 self.frame.title.delete(0,Tkinter.END) 187 self.frame.title.insert(Tkinter.END, self.container_class.header.ljust(max_len))
188
189 - def add_new(self):
190 contained_object = self.make_contained_object(self.container_class) 191 if contained_object: 192 self.list.append( [contained_object] ) 193 self.update_now()
194
195 - def edit_selected(self,dummy_arg=None):
196 selected = self.get_selected() 197 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 198 loop_coordinates = self.