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

Source Code for Module VisionEgg.PyroApps.TargetGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: TargetGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle small target stimulus (client-side)""" 
 15   
 16  import VisionEgg 
 17  __version__ = VisionEgg.release_name 
 18  __cvs__ = '$Revision$'.split()[1] 
 19  __date__ = ' '.join('$Date$'.split()[1:3]) 
 20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 21   
 22  import sys, os, math 
 23  import Tkinter 
 24  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 25   
26 -def get_control_list():
27 return [("target_server",TargetControlFrame,TargetControlFrame.title)]
28
29 -class TargetMetaParameters:
30 - def __init__(self):
31 # colors 32 self.color = (0.0, 0.0, 0.0, 1.0) 33 self.bgcolor = (1.0, 1.0, 1.0, 0.0) 34 35 # motion parameters 36 self.start_x = 10.0 37 self.start_y = 50.0 38 self.velocity_pps = 100.0 # pixels per second 39 self.direction_deg = 0.0 40 41 # size and orientation 42 self.width = 10.0 43 self.height = 30.0 44 self.orientation_deg = 0.0 45 46 self.pre_stim_sec = 1.0 47 self.stim_sec = 2.0 48 self.post_stim_sec = 1.0
49
50 -class TargetControlFrame(client_utils.StimulusControlFrame):
51 title = "Moving Target Experiment"
52 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
53 client_utils.StimulusControlFrame.__init__(self, 54 master, 55 suppress_go_buttons, 56 TargetControlFrame.title, 57 TargetMetaParameters, 58 **kw) 59 60 param_frame = self.param_frame # shorthand for self.param_frame created in base class 61 62 pf_row = 0 63 Tkinter.Label(param_frame,text="Start X (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 64 self.start_x_tk_var = Tkinter.DoubleVar() 65 self.start_x_tk_var.set(self.meta_params.start_x) 66 self.make_callback_entry(textvariable=self.start_x_tk_var).grid(row=pf_row,column=2) 67 self.loopable_variables["Start X"] = ("start_x",self.start_x_tk_var) 68 69 pf_row += 1 70 Tkinter.Label(param_frame,text="Start Y (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 71 self.start_y_tk_var = Tkinter.DoubleVar() 72 self.start_y_tk_var.set(self.meta_params.start_y) 73 self.make_callback_entry(textvariable=self.start_y_tk_var).grid(row=pf_row,column=2) 74 self.loopable_variables["Start Y"] = ("start_y",self.start_y_tk_var) 75 76 pf_row += 1 77 Tkinter.Label(param_frame,text="Velocity (pixels/sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 78 self.velocity_tk_var = Tkinter.DoubleVar() 79 self.velocity_tk_var.set(self.meta_params.velocity_pps) 80 self.make_callback_entry(textvariable=self.velocity_tk_var).grid(row=pf_row,column=2) 81 self.loopable_variables["Velocity"] = ("velocity_pps",self.velocity_tk_var) 82 83 pf_row += 1 84 Tkinter.Label(param_frame,text="Direction (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) 85 self.direction_tk_var = Tkinter.DoubleVar() 86 self.direction_tk_var.set(self.meta_params.direction_deg) 87 self.make_callback_entry(textvariable=self.direction_tk_var).grid(row=pf_row,column=2) 88 self.loopable_variables["Direction"] = ("direction_deg",self.direction_tk_var) 89 90 pf_row += 1 91 Tkinter.Label(param_frame,text="Color:").grid(row=pf_row,column=0,sticky=Tkinter.E) 92 self.color_tk_var = Tkinter.StringVar() 93 self.color_tk_var.set("black on white") 94 bar = Tkinter.Menubutton(param_frame, textvariable=self.color_tk_var, relief=Tkinter.RAISED) 95 bar.grid(row=pf_row, column=2, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) 96 bar.menu = Tkinter.Menu(bar,tearoff=0) 97 bar.menu.add_radiobutton(label="white on black", 98 value="white on black", 99 variable=self.color_tk_var, 100 command=self.send_values) 101 bar.menu.add_radiobutton(label="black on white", 102 value="black on white", 103 variable=self.color_tk_var, 104 command=self.send_values) 105 bar['menu'] = bar.menu 106 107 pf_row += 1 108 Tkinter.Label(param_frame,text="Orientation (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) 109 self.ortho_tk_var = Tkinter.StringVar() 110 self.ortho_tk_var.set("ortho") 111 112 manual = Tkinter.Radiobutton( param_frame, text="Manual", 113 variable=self.ortho_tk_var, value="manual") 114 manual.grid(row=pf_row,column=1) 115 116 self.orient_tk_var = Tkinter.DoubleVar() 117 self.orient_tk_var.set(self.meta_params.orientation_deg) 118 119 manual_entry = Tkinter.Entry( param_frame, 120 textvariable=self.orient_tk_var, 121 width=self.entry_width ) 122 manual_entry.grid(row=pf_row,column=2) 123 124 ortho = Tkinter.Radiobutton( param_frame, text="Orthogonal to motion", 125 variable=self.ortho_tk_var, value="ortho") 126 ortho.grid(row=pf_row,column=3) 127 self.loopable_variables["Orientation"] = ("orientation_deg",self.orient_tk_var) 128 129 pf_row += 1 130 Tkinter.Label(param_frame,text="Width (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 131 self.width_tk_var = Tkinter.DoubleVar() 132 self.width_tk_var.set(self.meta_params.width) 133 self.make_callback_entry(textvariable=self.width_tk_var).grid(row=pf_row,column=2) 134 self.loopable_variables["Width"] = ("width",self.width_tk_var) 135 136 pf_row += 1 137 Tkinter.Label(param_frame,text="Height (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 138 self.height_tk_var = Tkinter.DoubleVar() 139 self.height_tk_var.set(self.meta_params.height) 140 self.make_callback_entry(textvariable=self.height_tk_var).grid(row=pf_row,column=2) 141 self.loopable_variables["Height"] = ("height",self.height_tk_var) 142 143 pf_row += 1 144 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 145 self.prestim_dur_tk_var = Tkinter.DoubleVar() 146 self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) 147 self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=2) 148 149 pf_row += 1 150 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 151 self.stim_dur_tk_var = Tkinter.DoubleVar() 152 self.stim_dur_tk_var.set(self.meta_params.stim_sec) 153 self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=2) 154 self.loopable_variables["Duration"] = ("stim_sec",self.stim_dur_tk_var) 155 156 pf_row += 1 157 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 158 self.poststim_dur_tk_var = Tkinter.DoubleVar() 159 self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) 160 self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=2)
161
162 - def get_shortname(self):
163 return "target"
164
165 - def update_tk_vars(self):
166 self.start_x_tk_var.set( self.meta_params.start_x ) 167 self.start_y_tk_var.set( self.meta_params.start_y ) 168 self.velocity_tk_var.set( self.meta_params.velocity_pps ) 169 self.direction_tk_var.set( self.meta_params.direction_deg ) 170 self.orient_tk_var.set( self.meta_params.orientation_deg ) 171 self.width_tk_var.set( self.meta_params.width ) 172 self.height_tk_var.set( self.meta_params.height ) 173 self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) 174 self.stim_dur_tk_var.set( self.meta_params.stim_sec ) 175 self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) 176 177 if self.meta_params.color == (0.0,0.0,0.0,1.0) and self.meta_params.bgcolor == (1.0,1.0,1.0,0.0): 178 self.color_tk_var.set( "black on white" ) 179 elif self.meta_params.color == (1.0,1.0,1.0,1.0) and self.meta_params.bgcolor == (0.0,0.0,0.0,0.0): 180 self.color_tk_var.set( "white on black" ) 181 else: 182 raise RuntimeError("Cannot set tk variable for color")
183
184 - def send_values(self,dummy_arg=None):
185 self.meta_params.start_x = self.start_x_tk_var.get() 186 self.meta_params.start_y = self.start_y_tk_var.get() 187 self.meta_params.velocity_pps = self.velocity_tk_var.get() 188 self.meta_params.direction_deg = self.direction_tk_var.get() 189 if self.color_tk_var.get() == "black on white": 190 self.meta_params.color = (0.0,0.0,0.0,1.0) 191 self.meta_params.bgcolor = (1.0,1.0,1.0,0.0) 192 elif self.color_tk_var.get() == "white on black": 193 self.meta_params.color = (1.0,1.0,1.0,1.0) 194 self.meta_params.bgcolor = (0.0,0.0,0.0,0.0) 195 196 if self.ortho_tk_var.get() == "ortho": 197 self.meta_params.orientation_deg = math.fmod(self.meta_params.direction_deg,360.0) 198 else: # it's "manual" 199 self.meta_params.orientation_deg = self.orient_tk_var.get() 200 self.meta_params.width = self.width_tk_var.get() 201 self.meta_params.height = self.height_tk_var.get() 202 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 203 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 204 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 205 if self.connected: 206 self.meta_controller.set_parameters( self.meta_params )
207
208 - def get_duration_sec(self):
209 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 210 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 211 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 212 return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec
213 214 if __name__=='__main__': 215 frame = TargetControlFrame() 216 frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) 217 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 218 frame.mainloop() 219