Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/allpy/rev/ef6692b5ffbc
Дата изменения: Unknown
Дата индексирования: Tue Oct 2 00:09:27 2012
Кодировка:
allpy: ef6692b5ffbc

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()