source: branches/casa-release-4_3-test/python/customgui_tkagg.py@ 3110

Last change on this file since 3110 was 2609, checked in by Kana Sugimoto, 12 years ago

New Development: No

JIRA Issue: No (workarounds for OSX 10.7)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs: interactive tests on OSX 10.7

plot data with asapplotter (sdplot)
load notaion window by clicking on plot after pressing 'notation' button
# check if notation widow has sufficient size.
write a text in text window and press 'print' button
# check if the text and positions are noted on log.

Put in Release Notes: No

Module(s): sdplot, sdflag, asapplotter, flagplotter

Description:

Worarounds to fix behaivour on OSX 10.7.
These workaounds should fix issuues:

  1. notation window is too small when loaded.
  2. an error raised when trying to print/modify notes on plots.


File size: 26.6 KB
Line 
1import os
2import matplotlib, numpy
3from asap.logging import asaplog, asaplog_post_dec
4from matplotlib.patches import Rectangle
5from asap.parameters import rcParams
6from asap._asap import stmath
7from asap.customgui_base import *
8
9import Tkinter as Tk
10import tkMessageBox
11
12######################################
13## Add CASA custom toolbar ##
14######################################
15class CustomToolbarTkAgg(CustomToolbarCommon, Tk.Frame):
16 def __init__(self,parent):
17 from asap.asapplotter import asapplotter
18 if not isinstance(parent,asapplotter):
19 return False
20 if not parent._plotter:
21 return False
22 self._p = parent._plotter
23 self.figmgr = self._p.figmgr
24 self.canvas = self.figmgr.canvas
25 self.mode = ''
26 self.button = True
27 self.pagecount = None
28 CustomToolbarCommon.__init__(self,parent)
29 self.notewin = NotationWindowTkAgg(master=self.canvas)
30 self._add_custom_toolbar()
31
32 def _add_custom_toolbar(self):
33 Tk.Frame.__init__(self,master=self.figmgr.window)
34 #self.bSpec = self._NewButton(master=self,
35 # text='spec value',
36 # command=self.spec_show)
37 self.bNote = self._NewButton(master=self,
38 text='notation',
39 command=self.modify_note)
40
41 self.bStat = self._NewButton(master=self,
42 text='statistics',
43 command=self.stat_cal)
44 self.bQuit = self._NewButton(master=self,
45 text='Quit',
46 command=self.quit,
47 side=Tk.RIGHT)
48
49 # page change oparations
50 frPage = Tk.Frame(master=self,borderwidth=2,relief=Tk.GROOVE)
51 frPage.pack(ipadx=2,padx=10,side=Tk.RIGHT)
52 self.lPagetitle = Tk.Label(master=frPage,text='Page:',padx=5)
53 self.lPagetitle.pack(side=Tk.LEFT)
54 self.pagecount = Tk.StringVar(master=frPage)
55 self.lPagecount = Tk.Label(master=frPage,
56 textvariable=self.pagecount,
57 padx=5,bg='white')
58 self.lPagecount.pack(side=Tk.LEFT,padx=3)
59
60 self.bNext = self._NewButton(master=frPage,
61 text=' + ',
62 command=self.next_page)
63 self.bPrev = self._NewButton(master=frPage,
64 text=' - ',
65 command=self.prev_page)
66
67 if os.uname()[0] != 'Darwin':
68 self.bPrev.config(padx=5)
69 self.bNext.config(padx=5)
70
71 self.pack(side=Tk.BOTTOM,fill=Tk.BOTH)
72 self.pagecount.set(' '*4)
73
74 self.disable_button()
75 return #self
76
77 def _NewButton(self, master, text, command, side=Tk.LEFT):
78 if os.uname()[0] == 'Darwin':
79 b = Tk.Button(master=master, text=text, command=command)
80 else:
81 b = Tk.Button(master=master, text=text, padx=2, pady=2,
82 command=command)
83 b.pack(side=side)
84 return b
85
86 def show_pagenum(self,pagenum,formatstr):
87 self.pagecount.set(formatstr % (pagenum))
88
89 def spec_show(self):
90 if not self.figmgr.toolbar.mode == '' or not self.button: return
91 self.figmgr.toolbar.set_message('spec value: drag on a spec')
92 if self.mode == 'spec': return
93 #self.bStat.config(relief='raised')
94 #self.bSpec.config(relief='sunken')
95 #self.bNote.config(relief='raised')
96 self.mode = 'spec'
97 self.notewin.close_widgets()
98 self.__disconnect_event()
99 self._p.register('button_press',self._select_spectrum)
100
101 def stat_cal(self):
102 if not self.figmgr.toolbar.mode == '' or not self.button: return
103 self.figmgr.toolbar.set_message('statistics: select a region')
104 if self.mode == 'stat':
105 # go back to spec mode
106 self.bStat.config(relief='raised')
107 self.spec_show()
108 return
109 #self.bSpec.config(relief='raised')
110 self.bStat.config(relief='sunken')
111 self.bNote.config(relief='raised')
112 self.mode = 'stat'
113 self.notewin.close_widgets()
114 self.__disconnect_event()
115 self._p.register('button_press',self._single_mask)
116
117 def modify_note(self):
118 if not self.figmgr.toolbar.mode == '': return
119 if self.mode == 'note':
120 self.bNote.config(relief='raised')
121 self.mode = 'none'
122 self.spec_show()
123 if not self.button:
124 self.notewin.close_widgets()
125 self.__disconnect_event()
126 return
127 self.figmgr.toolbar.set_message('text: select a position/text')
128 #self.bSpec.config(relief='raised')
129 self.bStat.config(relief='raised')
130 self.bNote.config(relief='sunken')
131 self.mode = 'note'
132 self.__disconnect_event()
133 self._p.register('button_press',self._mod_note)
134
135 def quit(self):
136 self.__disconnect_event()
137 #self.delete_bar()
138 self.disable_button()
139 self.figmgr.window.wm_withdraw()
140 self._p.quit()
141
142 def enable_button(self):
143 if self.button: return
144 #self.bSpec.config(state=Tk.NORMAL)
145 self.bStat.config(state=Tk.NORMAL)
146 self.button = True
147 self.spec_show()
148
149 def disable_button(self):
150 if not self.button: return
151 #self.bSpec.config(relief='raised', state=Tk.DISABLED)
152 self.bStat.config(relief='raised', state=Tk.DISABLED)
153 self.bNext.config(state=Tk.DISABLED)
154 self.bPrev.config(state=Tk.DISABLED)
155 self.button = False
156 self.mode = ''
157 self.__disconnect_event()
158
159 def enable_next(self):
160 self.bNext.config(state=Tk.NORMAL)
161
162 def disable_next(self):
163 self.bNext.config(state=Tk.DISABLED)
164
165 def enable_prev(self):
166 self.bPrev.config(state=Tk.NORMAL)
167
168 def disable_prev(self):
169 self.bPrev.config(state=Tk.DISABLED)
170
171 # pause buttons for slow operations
172 def _pause_buttons(self,operation="end",msg=""):
173 buttons = ["bStat","bNote","bQuit"]
174 if operation == "start":
175 state = Tk.DISABLED
176 else:
177 state = Tk.NORMAL
178 for btn in buttons:
179 getattr(self,btn).config(state=state)
180 self.figmgr.toolbar.set_message(msg)
181
182 def delete_bar(self):
183 self.__disconnect_event()
184 self.destroy()
185
186 def __disconnect_event(self):
187 self._p.register('button_press',None)
188 self._p.register('button_release',None)
189
190 def _draw_span(self,axes,x0,x1,**kwargs):
191 height = self._p.figure.bbox.height
192 y0 = height - axes.bbox.y0
193 y1 = height - axes.bbox.y1
194 return self._p.canvas._tkcanvas.create_rectangle(x0,y0,x1,y1,**kwargs)
195
196 def _remove_span(self,span):
197 self._p.canvas._tkcanvas.delete(span)
198
199
200
201######################################
202## Notation box window ##
203######################################
204class NotationWindowTkAgg(NotationWindowCommon):
205 """
206 Backend based class to create widgets to add, modify, or delete
207 note on the plot.
208
209 Note:
210 Press LEFT-mouse button on the plot to ADD a note on the canvas.
211 A notation window will be loaded for specifying note string and
212 anchor. The note will be anchored on a position in whether figure-
213 (0-1 relative in a figure), panel- (0-1 relative in a plot axes),
214 or data-coordinate (data value in a plot axes).
215 Press RIGHT-mouse button on a note to MODIFY/DELETE it. A cascade
216 menu will be displayed and you can select an operation.
217 """
218 def __init__(self,master=None):
219 self.parent = master._tkcanvas
220 NotationWindowCommon.__init__(self,master=master)
221 self.anchval = None
222 self.textwin = self._create_textwindow(master=None)
223 self.menu = self._create_modmenu(master=self.parent)
224
225 ### Notation window widget
226 def _create_textwindow(self,master=None):
227 """Create notation window widget and iconfy it"""
228 twin = Tk.Toplevel(padx=3,pady=3)
229 twin.title("Notation")
230 twin.resizable(width=True,height=True)
231 self.textbox = self._NotationBox(parent=twin)
232 self.radio = self._AnchorRadio(parent=twin)
233 self.actionbs = self._ActionButtons(parent=twin)
234
235 self.textbox.pack(side=Tk.TOP,fill=Tk.BOTH,expand=True)
236 self.actionbs.pack(side=Tk.BOTTOM)
237 self.radio.pack(side=Tk.BOTTOM)
238 #twin.deiconify()
239 #twin.minsize(width=twin.winfo_width(),height=twin.winfo_height())
240 #twin.lift()
241 twin.withdraw()
242 return twin
243
244 def _NotationBox(self,parent=None):
245 textbox = Tk.Text(master=parent,background='white',
246 height=2,width=20,cursor="xterm",
247 padx=2,pady=2,undo=True,maxundo=10,
248 relief='sunken',borderwidth=3,
249 state=Tk.NORMAL,takefocus=1)
250 return textbox
251
252 def _AnchorRadio(self,parent=None):
253 radio = Tk.LabelFrame(master=parent,text="anchor",
254 labelanchor="nw",padx=5,pady=3)
255 self.anchval = Tk.IntVar(master=radio,value=0)
256 self.rFig = self._NewRadioButton(radio,"figure",state=Tk.NORMAL,
257 variable=self.anchval,value=0,
258 side=Tk.LEFT)
259 self.rAxis = self._NewRadioButton(radio,"panel",state=Tk.DISABLED,
260 variable=self.anchval,value=1,
261 side=Tk.LEFT)
262 self.rData = self._NewRadioButton(radio,"data",state=Tk.DISABLED,
263 variable=self.anchval,value=2,
264 side=Tk.LEFT)
265 # set initial selection "figure"
266 self.anchval.set(0)
267 return radio
268
269 def _NewRadioButton(self,parent,text,state=Tk.NORMAL,variable=None,value=None,side=Tk.LEFT):
270 rb = Tk.Radiobutton(master=parent,text=text,state=state,
271 variable=variable,value=value)
272 rb.pack(side=side)
273 return rb
274
275 def _enable_radio(self):
276 """Enable 'panel' and 'data' radio button"""
277 self.rAxis.config(state=Tk.NORMAL)
278 self.rData.config(state=Tk.NORMAL)
279 #self.rFig.config(state=Tk.NORMAL)
280 self.rFig.select()
281
282 def _reset_radio(self):
283 """Disable 'panel' and 'data' radio button"""
284 self.rAxis.config(state=Tk.DISABLED)
285 self.rData.config(state=Tk.DISABLED)
286 self.rFig.config(state=Tk.NORMAL)
287 self.rFig.select()
288
289 def _select_radio(self,selection):
290 """Select a specified radio button"""
291 if not selection in self.anchors:
292 return
293 if selection == "data":
294 self.rData.select()
295 elif selection == "axes":
296 self.rAxis.select()
297 else:
298 self.rFig.select()
299
300 def _get_anchval(self):
301 """Returns a integer of a selected radio button"""
302 return self.anchval.get()
303
304 def _get_note(self):
305 """Returns a note string specified in the text box"""
306 # A WORKAROUND for OSX 10.7 (Tk.Text returns unicode but asaplog doesn't accept it)
307 #return self.textbox.get("1.0",Tk.END)
308 return str(self.textbox.get("1.0",Tk.END))
309
310 def _clear_textbox(self):
311 """Clear the text box"""
312 self.textbox.delete("1.0",Tk.END)
313
314 def _set_note(self,note=None):
315 """Set a note string to the text box"""
316 self._clear_textbox()
317 if len(note) >0:
318 self.textbox.insert("1.0",note)
319
320 def _ActionButtons(self,parent=None):
321 actbuts = Tk.Frame(master=parent)
322 bCancel = self._NewButton(actbuts,"cancel",self._cancel_text,side=Tk.LEFT)
323 bPrint = self._NewButton(actbuts,"print", self._print_text,side=Tk.LEFT)
324 return actbuts
325
326 def _NewButton(self, parent, text, command, side=Tk.LEFT):
327 if(os.uname()[0] == 'Darwin'):
328 b = Tk.Button(master=parent, text=text, command=command)
329 else:
330 b = Tk.Button(master=parent, text=text, padx=2, pady=2, command=command)
331 b.pack(side=side)
332 return b
333
334 def _cancel_text(self):
335 """
336 Cancel adding/modifying a note and close notaion window.
337 called when 'cancel' is selected.
338 """
339 self.close_textwindow()
340
341 def _print_text(self):
342 """
343 Add/Modify a note. Called when 'print' is selected on the
344 notation window.
345 """
346 self.print_text()
347 self.close_textwindow()
348
349 def load_textwindow(self,event):
350 """
351 Load text window at a event position to add a note on a plot.
352 Parameter:
353 event: an even object to specify the position to load
354 text window.
355 """
356 self.close_modmenu()
357 if event.canvas._tkcanvas != self.parent:
358 raise RuntimeError, "Got invalid event!"
359
360 self.event = event
361 is_ax = (event.inaxes != None)
362 (xpix, ypix) = self._disppix2screen(event.x, event.y)
363 offset = 5
364 self.show_textwindow(xpix+offset,ypix+offset,enableaxes=is_ax)
365
366 def show_textwindow(self,xpix,ypix,basetext=None,enableaxes=False):
367 """
368 Load text window at a position of screen to add a note on a plot.
369 Parameters:
370 xpix, ypix: a pixel position from Upper-left corner
371 of the screen.
372 basetext: None (default) or any string.
373 A string to be printed on text box when loaded.
374 enable axes: False (default) or True.
375 If True, 'panel' & 'data' radio button is enabled.
376 """
377 if not self.textwin: return
378 self._reset_radio()
379 if enableaxes:
380 self._enable_radio()
381 self.textwin.deiconify()
382 (w,h) = self.textwin.minsize()
383 # WORKAROUND for too small default minsize on OSX 10.7
384 #if w*h <= 1:
385 if w*h <= 1500:
386 self.textwin.minsize(width=self.textwin.winfo_width(),
387 height=self.textwin.winfo_height())
388 (w,h) = self.textwin.minsize()
389 self.textwin.geometry("%sx%s+%s+%s"%(w,h,xpix,ypix))
390 self.textwin.lift()
391
392 def close_textwindow(self):
393 """Close text window."""
394 self.seltext = {}
395 self._reset_radio()
396 self._clear_textbox()
397 self.textwin.withdraw()
398
399
400 ### Modify/Delete menu widget
401 def _create_modmenu(self,master=None):
402 """Create modify/delete menu widget"""
403 if master:
404 self.parent = master
405 if not self.parent:
406 return False
407 menu = Tk.Menu(master=self.parent,tearoff=False)
408 menu.add_command(label="Modify",command=self._modify_note)
409 menu.add_command(label="Delete",command=self._delnote_dialog)
410 return menu
411
412 def load_modmenu(self,event):
413 """
414 Load cascade menu at a event position to modify or delete
415 selected text.
416 Parameter:
417 event: an even object to specify the position to load
418 text window.
419 """
420 self.close_textwindow()
421 self.seltext = self._get_selected_text(event)
422 if len(self.seltext) == 3:
423 tkcanvas = event.canvas._tkcanvas
424 xpos = tkcanvas.winfo_rootx() + int(event.x)
425 ypos = tkcanvas.winfo_rooty() \
426 + tkcanvas.winfo_height() - int(event.y)
427 self.menu.post(xpos,ypos)
428
429 def close_modmenu(self):
430 """Close cascade menu."""
431 self.seltext = {}
432 self.menu.unpost()
433
434 ### load text window for modification
435 def _modify_note(self):
436 """helper function to load text window to modify selected note"""
437 #print "Modify selected!!"
438 textobj = self.seltext['textobj']
439 (xtx, ytx) = textobj._get_xy_display()
440 is_ax = (self.seltext['anchor'] != 'figure')
441 if not is_ax:
442 # previous anchor is figure
443 pos = textobj.get_position()
444 is_ax = (self._get_axes_from_pos(pos,self.canvas) != None)
445
446 (xpix, ypix) = self._disppix2screen(xtx,ytx)
447 offset = int(textobj.get_size())*2
448 self.show_textwindow(xpix,ypix+offset,basetext=textobj.get_text(),\
449 enableaxes=is_ax)
450 self._select_radio(self.seltext['anchor'])
451 self._set_note(textobj.get_text())
452
453 ### close all widgets
454 def close_widgets(self):
455 """Close note window and menu"""
456 self.close_textwindow()
457 self.close_modmenu()
458
459 ### dialog to confirm deleting note
460 def _delnote_dialog(self):
461 """Load dialog to confirm deletion of the text"""
462 remind = "Delete text?\n '"+self.seltext['textobj'].get_text()+"'"
463 answer = tkMessageBox.askokcancel(parent=self.parent,title="Delete?",
464 message=remind,
465 default=tkMessageBox.CANCEL)
466 if answer:
467 self.delete_note()
468 else:
469 self.cancel_delete()
470
471 ### helper functions
472 def _disppix2screen(self,xpixd,ypixd):
473 """
474 helper function to calculate a pixel position form Upper-left
475 corner of the SCREEN from a pixel position (xpixd, ypixd)
476 from Lower-left of the CANVAS (which, e.g., event.x/y returns)
477
478 Returns:
479 (x, y): pixel position from Upper-left corner of the SCREEN.
480 """
481 xpixs = self.parent.winfo_rootx() + xpixd
482 ypixs = self.parent.winfo_rooty() + self.parent.winfo_height() \
483 - ypixd
484 return (int(xpixs), int(ypixs))
485
486
487
488
489
490
491###########################################
492## Add CASA custom Flag toolbar ##
493###########################################
494class CustomFlagToolbarTkAgg(CustomFlagToolbarCommon, Tk.Frame):
495 def __init__(self,parent):
496 from asap.asapplotter import asapplotter
497 if not isinstance(parent,asapplotter):
498 return False
499 if not parent._plotter:
500 return False
501 self._p = parent._plotter
502 self.figmgr = self._p.figmgr
503 self.canvas = self.figmgr.canvas
504 self.mode = ''
505 self.button = True
506 self.pagecount = None
507 CustomFlagToolbarCommon.__init__(self,parent)
508 self.notewin=NotationWindowTkAgg(master=self.canvas)
509 self._add_custom_toolbar()
510
511 def _add_custom_toolbar(self):
512 Tk.Frame.__init__(self,master=self.figmgr.window)
513 #self.bSpec = self._NewButton(master=self,
514 # text='spec value',
515 # command=self.spec_show)
516
517 self.bRegion = self._NewButton(master=self,
518 text='region',
519 command=self.select_region)
520 self.bPanel = self._NewButton(master=self,
521 text='panel',
522 command=self.select_panel)
523 self.bClear = self._NewButton(master=self,
524 text='clear',
525 command=self.cancel_select)
526 self.bFlag = self._NewButton(master=self,
527 text='flag',
528 command=self.flag)
529 self.bUnflag = self._NewButton(master=self,
530 text='unflag',
531 command=self.unflag)
532
533 self.bStat = self._NewButton(master=self,
534 text='statistics',
535 command=self.stat_cal)
536
537 self.bNote = self._NewButton(master=self,
538 text='notation',
539 command=self.modify_note)
540
541 self.bQuit = self._NewButton(master=self,
542 text='Quit',
543 #file="stock_close.ppm",
544 command=self.quit,
545 side=Tk.RIGHT)
546
547 # page change oparations
548 frPage = Tk.Frame(master=self,borderwidth=2,relief=Tk.GROOVE)
549 frPage.pack(ipadx=2,padx=10,side=Tk.RIGHT)
550 self.lPagetitle = Tk.Label(master=frPage,text='Page:',padx=5)
551 #width=8,anchor=Tk.E,padx=5)
552 self.lPagetitle.pack(side=Tk.LEFT)
553 self.pagecount = Tk.StringVar(master=frPage)
554 self.lPagecount = Tk.Label(master=frPage,
555 textvariable=self.pagecount,
556 padx=5,bg='white')
557 self.lPagecount.pack(side=Tk.LEFT,padx=3)
558
559 self.bNext=self._NewButton(master=frPage,
560 text=' + ',
561 #file="hand.ppm",
562 command=self.next_page)
563 self.bPrev=self._NewButton(master=frPage,
564 text=' - ',
565 command=self.prev_page)
566
567 if os.uname()[0] != 'Darwin':
568 self.bPrev.config(padx=5)
569 self.bNext.config(padx=5)
570
571 self.pack(side=Tk.BOTTOM,fill=Tk.BOTH)
572 self.pagecount.set(' '*4)
573
574 self.disable_button()
575 return #self
576
577 def _NewButton(self, master, text, command, side=Tk.LEFT,file=None):
578 img = None
579 if file:
580 file = os.path.join(matplotlib.rcParams['datapath'], 'images', file)
581 img = Tk.PhotoImage(master=master, file=file)
582
583 if os.uname()[0] == 'Darwin':
584 b = Tk.Button(master=master, text=text, image=img,
585 command=command)
586 if img: b.image = img
587 else:
588 b = Tk.Button(master=master, text=text, image=img, padx=2, pady=2,
589 command=command)
590 if img: b.image = img
591 b.pack(side=side)
592 return b
593
594 def show_pagenum(self,pagenum,formatstr):
595 self.pagecount.set(formatstr % (pagenum))
596
597 def spec_show(self):
598 if not self.figmgr.toolbar.mode == '' or not self.button: return
599 self.figmgr.toolbar.set_message('spec value: drag on a spec')
600 if self.mode == 'spec': return
601 self.mode = 'spec'
602 self.notewin.close_widgets()
603 self.__disconnect_event()
604 self._p.register('button_press',self._select_spectrum)
605
606 def modify_note(self):
607 if not self.figmgr.toolbar.mode == '': return
608 if self.mode == 'note':
609 self.bNote.config(relief='raised')
610 self.mode = 'none'
611 self.spec_show()
612 if not self.button:
613 self.notewin.close_widgets()
614 self.__disconnect_event()
615 return
616 self.figmgr.toolbar.set_message('text: select a position/text')
617 self.bNote.config(relief='sunken')
618 self.bRegion.config(relief='raised')
619 self.bPanel.config(relief='raised')
620 self.mode = 'note'
621 self.__disconnect_event()
622 self._p.register('button_press',self._mod_note)
623
624 def select_region(self):
625 if not self.figmgr.toolbar.mode == '' or not self.button: return
626 if self.mode == 'region':
627 self.bRegion.config(relief='raised')
628 self.mode = 'none'
629 self.spec_show()
630 return
631 self.figmgr.toolbar.set_message('select regions: click at start and end channels')
632 self.bNote.config(relief='raised')
633 self.bRegion.config(relief='sunken')
634 self.bPanel.config(relief='raised')
635 self.mode = 'region'
636 self.notewin.close_widgets()
637 self.__disconnect_event()
638 self._p.register('button_press',self._add_region)
639
640 def select_panel(self):
641 if not self.figmgr.toolbar.mode == '' or not self.button: return
642 if self.mode == 'panel':
643 self.bPanel.config(relief='raised')
644 self.mode = 'none'
645 self.spec_show()
646 return
647 self.figmgr.toolbar.set_message('select spectra: click on subplots')
648 self.bNote.config(relief='raised')
649 self.bRegion.config(relief='raised')
650 self.bPanel.config(relief='sunken')
651 self.mode = 'panel'
652 self.notewin.close_widgets()
653 self.__disconnect_event()
654 self._p.register('button_press',self._add_panel)
655
656 def quit(self):
657 self.__disconnect_event()
658 self.disable_button()
659 self.figmgr.window.wm_withdraw()
660 self._p.quit()
661
662 def enable_button(self):
663 if self.button: return
664 self.bRegion.config(state=Tk.NORMAL)
665 self.bPanel.config(state=Tk.NORMAL)
666 self.bClear.config(state=Tk.NORMAL)
667 self.bFlag.config(state=Tk.NORMAL)
668 self.bUnflag.config(state=Tk.NORMAL)
669 self.bStat.config(state=Tk.NORMAL)
670 self.button = True
671 self.spec_show()
672
673 def disable_button(self):
674 ## disable buttons which don't work for plottp
675 if not self.button: return
676 self.bRegion.config(relief='raised')
677 self.bPanel.config(relief='raised')
678 self.bRegion.config(state=Tk.DISABLED)
679 self.bPanel.config(state=Tk.DISABLED)
680 self.bClear.config(state=Tk.DISABLED)
681 self.bFlag.config(state=Tk.DISABLED)
682 self.bUnflag.config(state=Tk.DISABLED)
683 self.bStat.config(state=Tk.DISABLED)
684 self.bNext.config(state=Tk.DISABLED)
685 self.bPrev.config(state=Tk.DISABLED)
686 self.button = False
687 self.mode = ''
688 self.notewin.close_widgets()
689 self.__disconnect_event()
690
691 def enable_next(self):
692 self.bNext.config(state=Tk.NORMAL)
693
694 def disable_next(self):
695 self.bNext.config(state=Tk.DISABLED)
696
697 def enable_prev(self):
698 self.bPrev.config(state=Tk.NORMAL)
699
700 def disable_prev(self):
701 self.bPrev.config(state=Tk.DISABLED)
702
703 # pause buttons for slow operations
704 def _pause_buttons(self,operation="end",msg=""):
705 buttons = ["bRegion","bPanel","bClear","bFlag","bUnflag","bStat",
706 "bNote","bQuit"]
707 if operation == "start":
708 state=Tk.DISABLED
709 else:
710 state=Tk.NORMAL
711 for btn in buttons:
712 getattr(self,btn).config(state=state)
713 self.figmgr.toolbar.set_message(msg)
714
715 def delete_bar(self):
716 self.__disconnect_event()
717 self.destroy()
718
719 def __disconnect_event(self):
720 self._p.register('button_press',None)
721 self._p.register('button_release',None)
722
723 def _draw_span(self,axes,x0,x1,**kwargs):
724 height = self._p.figure.bbox.height
725 y0 = height - axes.bbox.y0
726 y1 = height - axes.bbox.y1
727 return self._p.canvas._tkcanvas.create_rectangle(x0,y0,x1,y1,**kwargs)
728
729 def _remove_span(self,span):
730 self._p.canvas._tkcanvas.delete(span)
Note: See TracBrowser for help on using the repository browser.