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