Home | History | Annotate | Download | only in ttk
      1 """This demonstrates good part of the syntax accepted by theme_create.
      2 
      3 This is a translation of plastik.tcl to python.
      4 You will need the images used by the plastik theme to test this. The
      5 images (and other tile themes) can be retrived by doing:
      6 
      7 $ cvs -z3 -d:pserver:anonymous (at] tktable.cvs.sourceforge.net:/cvsroot/tktable \
      8   co tile-themes
      9 
     10 To test this module you should do, for example:
     11 
     12 import Tkinter
     13 import plastik_theme
     14 
     15 root = Tkinter.Tk()
     16 plastik_theme.install(plastik_image_dir)
     17 ...
     18 
     19 Where plastik_image_dir contains the path to the images directory used by
     20 the plastik theme, something like: tile-themes/plastik/plastik
     21 """
     22 import os
     23 import glob
     24 import ttk
     25 from Tkinter import PhotoImage
     26 
     27 __all__ = ['install']
     28 
     29 colors = {
     30     "frame": "#efefef",
     31     "disabledfg": "#aaaaaa",
     32     "selectbg": "#657a9e",
     33     "selectfg": "#ffffff"
     34     }
     35 
     36 imgs = {}
     37 def _load_imgs(imgdir):
     38     imgdir = os.path.expanduser(imgdir)
     39     if not os.path.isdir(imgdir):
     40         raise Exception("%r is not a directory, can't load images" % imgdir)
     41     for f in glob.glob("%s/*.gif" % imgdir):
     42         img = os.path.split(f)[1]
     43         name = img[:-4]
     44         imgs[name] = PhotoImage(name, file=f, format="gif89")
     45 
     46 def install(imgdir):
     47     _load_imgs(imgdir)
     48     style = ttk.Style()
     49     style.theme_create("plastik", "default", settings={
     50         ".": {
     51             "configure":
     52                 {"background": colors['frame'],
     53                  "troughcolor": colors['frame'],
     54                  "selectbackground": colors['selectbg'],
     55                  "selectforeground": colors['selectfg'],
     56                  "fieldbackground": colors['frame'],
     57                  "font": "TkDefaultFont",
     58                  "borderwidth": 1},
     59             "map": {"foreground": [("disabled", colors['disabledfg'])]}
     60         },
     61 
     62         "Vertical.TScrollbar": {"layout": [
     63             ("Vertical.Scrollbar.uparrow", {"side": "top", "sticky": ''}),
     64             ("Vertical.Scrollbar.downarrow", {"side": "bottom", "sticky": ''}),
     65             ("Vertical.Scrollbar.uparrow", {"side": "bottom", "sticky": ''}),
     66             ("Vertical.Scrollbar.trough", {"sticky": "ns", "children":
     67                 [("Vertical.Scrollbar.thumb", {"expand": 1, "unit": 1,
     68                     "children": [("Vertical.Scrollbar.grip", {"sticky": ''})]
     69                 })]
     70             })]
     71         },
     72 
     73         "Horizontal.TScrollbar": {"layout": [
     74             ("Horizontal.Scrollbar.leftarrow", {"side": "left", "sticky": ''}),
     75             ("Horizontal.Scrollbar.rightarrow",
     76                 {"side": "right", "sticky": ''}),
     77             ("Horizontal.Scrollbar.leftarrow",
     78                 {"side": "right", "sticky": ''}),
     79             ("Horizontal.Scrollbar.trough", {"sticky": "ew", "children":
     80                 [("Horizontal.Scrollbar.thumb", {"expand": 1, "unit": 1,
     81                     "children": [("Horizontal.Scrollbar.grip", {"sticky": ''})]
     82                 })]
     83             })]
     84         },
     85 
     86         "TButton": {
     87             "configure": {"width": 10, "anchor": "center"},
     88             "layout": [
     89                 ("Button.button", {"children":
     90                     [("Button.focus", {"children":
     91                         [("Button.padding", {"children":
     92                             [("Button.label", {"side": "left", "expand": 1})]
     93                         })]
     94                     })]
     95                 })
     96             ]
     97         },
     98 
     99         "Toolbutton": {
    100             "configure": {"anchor": "center"},
    101             "layout": [
    102                 ("Toolbutton.border", {"children":
    103                     [("Toolbutton.button", {"children":
    104                         [("Toolbutton.padding", {"children":
    105                             [("Toolbutton.label", {"side":"left", "expand":1})]
    106                         })]
    107                     })]
    108                 })
    109             ]
    110         },
    111 
    112         "TMenubutton": {"layout": [
    113             ("Menubutton.button", {"children":
    114                 [("Menubutton.indicator", {"side": "right"}),
    115                  ("Menubutton.focus", {"children":
    116                     [("Menubutton.padding", {"children":
    117                         [("Menubutton.label", {"side": "left", "expand": 1})]
    118                     })]
    119                 })]
    120             })]
    121         },
    122 
    123         "TNotebook": {"configure": {"tabmargins": [0, 2, 0, 0]}},
    124         "TNotebook.tab": {
    125             "configure": {"padding": [6, 2, 6, 2], "expand": [0, 0, 2]},
    126             "map": {"expand": [("selected", [1, 2, 4, 2])]}
    127         },
    128         "Treeview": {"configure": {"padding": 0}},
    129 
    130         # elements
    131         "Button.button": {"element create":
    132             ("image", 'button-n',
    133                 ("pressed", 'button-p'), ("active", 'button-h'),
    134                 {"border": [4, 10], "padding": 4, "sticky":"ewns"}
    135             )
    136         },
    137 
    138         "Toolbutton.button": {"element create":
    139             ("image", 'tbutton-n',
    140                 ("selected", 'tbutton-p'), ("pressed", 'tbutton-p'),
    141                 ("active", 'tbutton-h'),
    142                 {"border": [4, 9], "padding": 3, "sticky": "news"}
    143             )
    144         },
    145 
    146         "Checkbutton.indicator": {"element create":
    147             ("image", 'check-nu',
    148                 ('active', 'selected', 'check-hc'),
    149                 ('pressed', 'selected', 'check-pc'),
    150                 ('active', 'check-hu'),
    151                 ("selected", 'check-nc'),
    152                 {"sticky": ''}
    153             )
    154         },
    155 
    156         "Radiobutton.indicator": {"element create":
    157             ("image", 'radio-nu',
    158                 ('active', 'selected', 'radio-hc'),
    159                 ('pressed', 'selected', 'radio-pc'),
    160                 ('active', 'radio-hu'), ('selected', 'radio-nc'),
    161                 {"sticky": ''}
    162             )
    163         },
    164 
    165         "Horizontal.Scrollbar.thumb": {"element create":
    166             ("image", 'hsb-n', {"border": 3, "sticky": "ew"})
    167         },
    168 
    169         "Horizontal.Scrollbar.grip": {"element create": ("image", 'hsb-g')},
    170         "Horizontal.Scrollbar.trough": {"element create": ("image", 'hsb-t')},
    171         "Vertical.Scrollbar.thumb": {"element create":
    172             ("image", 'vsb-n', {"border": 3, "sticky": "ns"})
    173         },
    174         "Vertical.Scrollbar.grip": {"element create": ("image", 'vsb-g')},
    175         "Vertical.Scrollbar.trough": {"element create": ("image", 'vsb-t')},
    176         "Scrollbar.uparrow": {"element create":
    177             ("image", 'arrowup-n', ("pressed", 'arrowup-p'), {"sticky": ''})
    178         },
    179         "Scrollbar.downarrow": {"element create":
    180             ("image", 'arrowdown-n',
    181             ("pressed", 'arrowdown-p'), {'sticky': ''})
    182         },
    183         "Scrollbar.leftarrow": {"element create":
    184             ("image", 'arrowleft-n',
    185             ("pressed", 'arrowleft-p'), {'sticky': ''})
    186         },
    187         "Scrollbar.rightarrow": {"element create":
    188             ("image", 'arrowright-n', ("pressed", 'arrowright-p'),
    189             {'sticky': ''})
    190         },
    191 
    192         "Horizontal.Scale.slider": {"element create":
    193             ("image", 'hslider-n', {'sticky': ''})
    194         },
    195         "Horizontal.Scale.trough": {"element create":
    196             ("image", 'hslider-t', {'border': 1, 'padding': 0})
    197         },
    198         "Vertical.Scale.slider": {"element create":
    199             ("image", 'vslider-n', {'sticky': ''})
    200         },
    201         "Vertical.Scale.trough": {"element create":
    202             ("image", 'vslider-t', {'border': 1, 'padding': 0})
    203         },
    204 
    205         "Entry.field": {"element create":
    206             ("image", 'entry-n',
    207                 ("focus", 'entry-f'),
    208                 {'border': 2, 'padding': [3, 4], 'sticky': 'news'}
    209             )
    210         },
    211 
    212         "Labelframe.border": {"element create":
    213             ("image", 'border', {'border': 4, 'padding': 4, 'sticky': 'news'})
    214         },
    215 
    216         "Menubutton.button": {"element create":
    217             ("image", 'combo-r',
    218                 ('active', 'combo-ra'),
    219                 {'sticky': 'news', 'border': [4, 6, 24, 15],
    220                  'padding': [4, 4, 5]}
    221             )
    222         },
    223         "Menubutton.indicator": {"element create":
    224             ("image", 'arrow-d', {"sticky": "e", "border": [15, 0, 0, 0]})
    225         },
    226 
    227         "Combobox.field": {"element create":
    228             ("image", 'combo-n',
    229                 ('readonly', 'active', 'combo-ra'),
    230                 ('focus', 'active', 'combo-fa'),
    231                 ('active', 'combo-a'), ('!readonly', 'focus', 'combo-f'),
    232                 ('readonly', 'combo-r'),
    233                 {'border': [4, 6, 24, 15], 'padding': [4, 4, 5],
    234                  'sticky': 'news'}
    235             )
    236         },
    237         "Combobox.downarrow": {"element create":
    238             ("image", 'arrow-d', {'sticky': 'e', 'border': [15, 0, 0, 0]})
    239          },
    240 
    241         "Notebook.client": {"element create":
    242             ("image", 'notebook-c', {'border': 4})
    243         },
    244         "Notebook.tab": {"element create":
    245             ("image", 'notebook-tn',
    246                 ("selected", 'notebook-ts'), ("active", 'notebook-ta'),
    247                 {'padding': [0, 2, 0, 0], 'border': [4, 10, 4, 10]}
    248             )
    249         },
    250 
    251         "Progressbar.trough": {"element create":
    252             ("image", 'hprogress-t', {'border': 2})
    253         },
    254         "Horizontal.Progressbar.pbar": {"element create":
    255             ("image", 'hprogress-b', {'border': [2, 9]})
    256         },
    257         "Vertical.Progressbar.pbar": {"element create":
    258             ("image", 'vprogress-b', {'border': [9, 2]})
    259         },
    260 
    261         "Treeheading.cell": {"element create":
    262             ("image", 'tree-n',
    263                 ("pressed", 'tree-p'),
    264                 {'border': [4, 10], 'padding': 4, 'sticky': 'news'}
    265             )
    266         }
    267 
    268     })
    269     style.theme_use("plastik")
    270