home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / webclean / !!!python!!! / BeOpen-Python-2.0.exe / TEXTVIEWER.PY < prev    next >
Encoding:
Python Source  |  2000-09-28  |  6.9 KB  |  188 lines

  1. """TextViewer class.
  2.  
  3. The TextViewer allows you to see how the selected color would affect various
  4. characteristics of a Tk text widget.  This is an output viewer only.
  5.  
  6. In the top part of the window is a standard text widget with some sample text
  7. in it.  You are free to edit this text in any way you want (TBD: allow you to
  8. change font characteristics).  If you want changes in other viewers to update
  9. text characteristics, turn on Track color changes.
  10.  
  11. To select which characteristic tracks the change, select one of the radio
  12. buttons in the window below.  Text foreground and background affect the text
  13. in the window above.  The Selection is what you see when you click the middle
  14. button and drag it through some text.  The Insertion is the insertion cursor
  15. in the text window (which only has a background).
  16. """
  17.  
  18. from Tkinter import *
  19. import ColorDB
  20.  
  21. ADDTOVIEW = 'Text Window...'
  22.  
  23. class TextViewer:
  24.     def __init__(self, switchboard, master=None):
  25.         self.__sb = switchboard
  26.         optiondb = switchboard.optiondb()
  27.         root = self.__root = Toplevel(master, class_='Pynche')
  28.         root.protocol('WM_DELETE_WINDOW', self.withdraw)
  29.         root.title('Pynche Text Window')
  30.         root.iconname('Pynche Text Window')
  31.         root.bind('<Alt-q>', self.__quit)
  32.         root.bind('<Alt-Q>', self.__quit)
  33.         root.bind('<Alt-w>', self.withdraw)
  34.         root.bind('<Alt-W>', self.withdraw)
  35.         #
  36.         # create the text widget
  37.         #
  38.         self.__text = Text(root, relief=SUNKEN,
  39.                            background=optiondb.get('TEXTBG', 'black'),
  40.                            foreground=optiondb.get('TEXTFG', 'white'),
  41.                            width=35, height=15)
  42.         sfg = optiondb.get('TEXT_SFG')
  43.         if sfg:
  44.             self.__text.configure(selectforeground=sfg)
  45.         sbg = optiondb.get('TEXT_SBG')
  46.         if sbg:
  47.             self.__text.configure(selectbackground=sbg)
  48.         ibg = optiondb.get('TEXT_IBG')
  49.         if ibg:
  50.             self.__text.configure(insertbackground=ibg)
  51.         self.__text.pack()
  52.         self.__text.insert(0.0, optiondb.get('TEXT', '''\
  53. Insert some stuff here and play
  54. with the buttons below to see
  55. how the colors interact in
  56. textual displays.
  57.  
  58. See how the selection can also
  59. be affected by tickling the buttons
  60. and choosing a color.'''))
  61.         insert = optiondb.get('TEXTINS')
  62.         if insert:
  63.             self.__text.mark_set(INSERT, insert)
  64.         try:
  65.             start, end = optiondb.get('TEXTSEL', (6.0, END))
  66.             self.__text.tag_add(SEL, start, end)
  67.         except ValueError:
  68.             # selection wasn't set
  69.             pass
  70.         self.__text.focus_set()
  71.         #
  72.         # variables
  73.         self.__trackp = BooleanVar()
  74.         self.__trackp.set(optiondb.get('TRACKP', 0))
  75.         self.__which = IntVar()
  76.         self.__which.set(optiondb.get('WHICH', 0))
  77.         #
  78.         # track toggle
  79.         self.__t = Checkbutton(root, text='Track color changes',
  80.                                variable=self.__trackp,
  81.                                relief=GROOVE,
  82.                                command=self.__toggletrack)
  83.         self.__t.pack(fill=X, expand=YES)
  84.         frame = self.__frame = Frame(root)
  85.         frame.pack()
  86.         #
  87.         # labels
  88.         self.__labels = []
  89.         row = 2
  90.         for text in ('Text:', 'Selection:', 'Insertion:'):
  91.             l = Label(frame, text=text)
  92.             l.grid(row=row, column=0, sticky=E)
  93.             self.__labels.append(l)
  94.             row = row + 1
  95.         col = 1
  96.         for text in ('Foreground', 'Background'):
  97.             l = Label(frame, text=text)
  98.             l.grid(row=1, column=col)
  99.             self.__labels.append(l)
  100.             col = col + 1
  101.         #
  102.         # radios
  103.         self.__radios = []
  104.         val = 0
  105.         for col in (1, 2):
  106.             for row in (2, 3, 4):
  107.                 # there is no insertforeground option
  108.                 if row==4 and col==1:
  109.                     continue
  110.                 r = Radiobutton(frame, variable=self.__which,
  111.                                 value=(row-2)*2 + col-1,
  112.                                 command=self.__set_color)
  113.                 r.grid(row=row, column=col)
  114.                 self.__radios.append(r)
  115.         self.__toggletrack()
  116.  
  117.     def __quit(self, event=None):
  118.         self.__root.quit()
  119.  
  120.     def withdraw(self, event=None):
  121.         self.__root.withdraw()
  122.  
  123.     def deiconify(self, event=None):
  124.         self.__root.deiconify()
  125.  
  126.     def __forceupdate(self, event=None):
  127.         self.__sb.update_views_current()
  128.  
  129.     def __toggletrack(self, event=None):
  130.         if self.__trackp.get():
  131.             state = NORMAL
  132.             fg = self.__radios[0]['foreground']
  133.         else:
  134.             state = DISABLED
  135.             fg = self.__radios[0]['disabledforeground']
  136.         for r in self.__radios:
  137.             r.configure(state=state)
  138.         for l in self.__labels:
  139.             l.configure(foreground=fg)
  140.  
  141.     def __set_color(self, event=None):
  142.         which = self.__which.get()
  143.         text = self.__text
  144.         if which == 0:
  145.             color = text['foreground']
  146.         elif which == 1:
  147.             color = text['background']
  148.         elif which == 2:
  149.             color = text['selectforeground']
  150.         elif which == 3:
  151.             color = text['selectbackground']
  152.         elif which == 5:
  153.             color = text['insertbackground']
  154.         try:
  155.             red, green, blue = ColorDB.rrggbb_to_triplet(color)
  156.         except ColorDB.BadColor:
  157.             # must have been a color name
  158.             red, green, blue = self.__sb.colordb().find_byname(color)
  159.         self.__sb.update_views(red, green, blue)
  160.  
  161.     def update_yourself(self, red, green, blue):
  162.         if self.__trackp.get():
  163.             colorname = ColorDB.triplet_to_rrggbb((red, green, blue))
  164.             which = self.__which.get()
  165.             text = self.__text
  166.             if which == 0:
  167.                 text.configure(foreground=colorname)
  168.             elif which == 1:
  169.                 text.configure(background=colorname)
  170.             elif which == 2:
  171.                 text.configure(selectforeground=colorname)
  172.             elif which == 3:
  173.                 text.configure(selectbackground=colorname)
  174.             elif which == 5:
  175.                 text.configure(insertbackground=colorname)
  176.  
  177.     def save_options(self, optiondb):
  178.         optiondb['TRACKP'] = self.__trackp.get()
  179.         optiondb['WHICH'] = self.__which.get()
  180.         optiondb['TEXT'] = self.__text.get(0.0, 'end - 1c')
  181.         optiondb['TEXTSEL'] = self.__text.tag_ranges(SEL)[0:2]
  182.         optiondb['TEXTINS'] = self.__text.index(INSERT)
  183.         optiondb['TEXTFG'] = self.__text['foreground']
  184.         optiondb['TEXTBG'] = self.__text['background']
  185.         optiondb['TEXT_SFG'] = self.__text['selectforeground']
  186.         optiondb['TEXT_SBG'] = self.__text['selectbackground']
  187.         optiondb['TEXT_IBG'] = self.__text['insertbackground']
  188.