allpy
changeset 7:ef6692b5ffbc
Added sandbox example editor for py3k+ttk
author | Danya Alexeyevsky <dendik@kodomo.fbb.msu.ru> |
---|---|
date | Thu, 10 Jun 2010 13:53:51 +0400 |
parents | a185e7e255b3 |
children | 208ec59bad5b |
files | sandbox/ttk.py |
diffstat | 1 files changed, 159 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/sandbox/ttk.py Thu Jun 10 13:53:51 2010 +0400 1.3 @@ -0,0 +1,159 @@ 1.4 +from tkinter import ttk, filedialog 1.5 +import tkinter 1.6 + 1.7 +class Scrollbar(tkinter.Scrollbar): 1.8 + 1.9 + def __init__(self, *args, **kw): 1.10 + tkinter.Scrollbar.__init__(self, *args, **kw) 1.11 + self['command'] = self._command 1.12 + self._attached_widgets = set() 1.13 + self._orient = {'horizontal': 'x', 'vertical': 'y'}[self['orient']] 1.14 + 1.15 + def attach(self, widget): 1.16 + self._attached_widgets.add(widget) 1.17 + command = self._orient + 'scrollcommand' 1.18 + widget[command] = lambda *args, **kw: self._set(widget, *args, **kw) 1.19 + 1.20 + def _command(self, *args, **kw): 1.21 + command = self._orient + 'view' 1.22 + result = None 1.23 + for widget in self._attached_widgets: 1.24 + result = getattr(widget, command)(*args, **kw) 1.25 + return result 1.26 + 1.27 + def _set(self, sender, *args, **kw): 1.28 + command = self._orient + 'view' 1.29 + self.set(*args, **kw) 1.30 + for widget in self._attached_widgets: 1.31 + if widget is sender: 1.32 + continue 1.33 + getattr(widget, command)('moveto', args[0]) 1.34 + 1.35 +class MegaText(tkinter.Text): 1.36 + 1.37 + def __init__(self, *args, **kw): 1.38 + tkinter.Text.__init__(self, *args, **kw) 1.39 + 1.40 + self.bind("<B1-Motion>", self._select) 1.41 + self.bind("<B1-ButtonRelease>", self._select_end) 1.42 + self.tag_configure('vselection', borderwidth=1, relief="solid", background='#ffbbbb') 1.43 + 1.44 + def tag_clear(self, tag): 1.45 + """Remove the tag from anywhere in the text.""" 1.46 + ranges = self.tag_ranges(tag) 1.47 + for begin, end in zip(ranges[::2], ranges[1::2]): 1.48 + self.tag_remove(tag, begin, end) 1.49 + 1.50 + def insert(self, *args, **kw): 1.51 + self['state'] = 'normal' 1.52 + result = tkinter.Text.insert(self, *args, **kw) 1.53 + self['state'] = 'disabled' 1.54 + return result 1.55 + 1.56 + def _select (self, ev): 1.57 + index = self.index("@%s,%s" % (ev.x, ev.y)) 1.58 + line, pos = map(int, index.split('.')) 1.59 + if not hasattr(self, '_selection'): 1.60 + self._selection = [line, line, pos, pos] 1.61 + self._selection[1] = line 1.62 + self._selection[3] = pos 1.63 + 1.64 + self.tag_clear('vselection') 1.65 + line0, line1 = sorted(self._selection[0:2]) 1.66 + pos0, pos1 = sorted(self._selection[2:4]) 1.67 + for line in range(line0, line1 + 1): 1.68 + self.tag_add( 1.69 + 'vselection', 1.70 + '%s.%s' % (line, pos0), 1.71 + '%s.%s' % (line, pos1) 1.72 + ) 1.73 + return "break" 1.74 + 1.75 + def _select_end(self, ev): 1.76 + self._select(ev) 1.77 + del self._selection 1.78 + return "break" 1.79 + 1.80 +def open_file(): 1.81 + global seqs 1.82 + names.delete(0, 'end') 1.83 + sequences.delete('1.0', 'end') 1.84 + 1.85 + filename = filedialog.askopenfilename() 1.86 + seqs = set() 1.87 + for item in open(filename).read().split('\n>'): 1.88 + lines = item.split('\n') 1.89 + name = lines[0].lstrip('>').strip() 1.90 + body = "".join(map(str.strip, lines[1:])) 1.91 + 1.92 + names.insert('end', name) 1.93 + sequences.insert('end', body+'\n') 1.94 + line = int(sequences.index('end - 1 line').split('.')[0]) 1.95 + seqs.add((name, body, line)) 1.96 + 1.97 +def colorize(): 1.98 + length = len(list(seqs)[0][1]) 1.99 + num_seqs = len(seqs) 1.100 + seq_weights = [] 1.101 + for pos in range(length): 1.102 + weights = {} 1.103 + for name, seq, _ in seqs: 1.104 + char = seq[pos] 1.105 + weights[char] = weights.get(char, 0) + 1 1.106 + for char in weights: 1.107 + weights[char] = weights[char] * 10 // num_seqs 1.108 + seq_weights.append(weights) 1.109 + 1.110 + for name, seq, line in seqs: 1.111 + for pos in range(len(seq)): 1.112 + char = seq[pos] 1.113 + tag = 'id%d0' % seq_weights[pos].get(char, 0) 1.114 + sequences.tag_add(tag, '%d.%d' % (line, pos)) 1.115 + 1.116 + for id in range(10+1): 1.117 + w = (10 - id) * 256 / 10 1.118 + color = '#%02x%02x%02x' % (w, w, w) 1.119 + sequences.tag_configure('id%d0' % id, background=color) 1.120 + 1.121 +root = tkinter.Tk() 1.122 + 1.123 +root.option_add('*tearOff', False) 1.124 +menu = tkinter.Menu(root) 1.125 +menu_file = tkinter.Menu(menu) 1.126 +menu_file.add_command(label='Open', command=open_file) 1.127 +menu.add_cascade(menu=menu_file, label='File') 1.128 +menu.add_command(label='Colorize', command=colorize) 1.129 +root['menu'] = menu 1.130 + 1.131 +main = ttk.PanedWindow(root, orient="horizontal") 1.132 +names = tkinter.Listbox(main) 1.133 +sequences = MegaText(main) 1.134 + 1.135 +sequences['font'] = names['font'] = "Courier 10" 1.136 + 1.137 +def _select(*args): 1.138 + sequences.tag_clear('sel') 1.139 + for line in names.curselection(): 1.140 + line = int(line) + 1 1.141 + sequences.tag_add('sel', "%s.0" % line, "%s.end" % line) 1.142 +sequences['inactiveselectbackground'] = 'blue' 1.143 +names.bind('<<ListboxSelect>>', _select) 1.144 + 1.145 +#sequences['spacing3'] = 1 1.146 +sequences['exportselection'] = False 1.147 +sequences['wrap'] = 'none' 1.148 +#names['selectborderwidth'] = -1 1.149 +names['highlightthickness'] = 0 1.150 +names['activestyle'] = 'none' 1.151 +names['exportselection'] = False 1.152 + 1.153 +main.add(names) 1.154 +main.add(sequences) 1.155 +main.pack(side='right', fill='both', expand=True) 1.156 + 1.157 +vscroll = Scrollbar(root, orient='vertical') 1.158 +vscroll.attach(names) 1.159 +vscroll.attach(sequences) 1.160 +vscroll.pack(side='right', fill='y') 1.161 + 1.162 +root.mainloop()