1616 # {{{1
1717r"""
1818
19- .. .
19+ Tkinter GUI .
2020
2121""" # }}}1
2222
2323import sys
2424
25+ import tkinter as tk
26+ import tkinter .font as tk_font
27+ from tkinter import Tk , Button , Canvas , Frame , Label
28+
2529from . import load_json , matches
2630
27- def tkinter_main (): # {{{1
28- import tkinter as tk
29- import tkinter .font as tk_font
30- from tkinter import Tk , Button , Canvas , Frame , Label
31+ NAME , TITLE = "kanjidraw" , "Kanji Draw"
32+ HEIGHT , WIDTH , BACKGROUND = 400 , 400 , "#ccc"
33+ ROWS , LINEWIDTH , FONTSIZE = 5 , 5 , 35
34+
35+ def gui (): # {{{1
36+ """Tkinter GUI."""
3137
3238 win = Tk ()
33- win .title ("Kanji Draw" )
39+ win .title (TITLE )
3440 win .columnconfigure (0 , weight = 1 )
3541 win .rowconfigure (0 , weight = 1 )
36-
37- height , width , bg , rows = 400 , 400 , "#ccc" , 5
38- font = tk_font .Font (size = 35 )
42+ font = tk_font .Font (size = FONTSIZE )
3943
4044 data = load_json ()
4145 max_strokes = max (data .keys ())
4246 drawing , x , y , strokes , lines = False , 0 , 0 , [], []
4347
4448 def on_mousedown (event ):
49+ nonlocal drawing , x , y
4550 if len (strokes ) < max_strokes :
46- nonlocal drawing , x , y
4751 drawing , x , y = True , event .x , event .y
48- strokes .append ([x * 255.0 / height , y * 255.0 / width ])
52+ strokes .append ([x * 255.0 / HEIGHT , y * 255.0 / WIDTH ])
4953 lines .append ([])
5054 enable_buttons ()
5155
@@ -60,7 +64,7 @@ def on_mouseup(event):
6064 if drawing :
6165 draw_line (x , y , event .x , event .y )
6266 drawing , x , y = False , event .x , event .y
63- strokes [- 1 ] += [x * 255.0 / height , y * 255.0 / width ]
67+ strokes [- 1 ] += [x * 255.0 / HEIGHT , y * 255.0 / WIDTH ]
6468 update_strokes ()
6569
6670 def on_undo ():
@@ -81,11 +85,12 @@ def on_clear():
8185 def on_done ():
8286 results_frame = Frame (win )
8387 for i , (_ , kanji ) in enumerate (matches (strokes , data )):
84- results_frame .columnconfigure (i % rows , weight = 1 )
85- results_frame .rowconfigure (i // rows , weight = 1 )
88+ col , row = i % ROWS , i // ROWS
89+ results_frame .columnconfigure (col , weight = 1 )
90+ results_frame .rowconfigure (row , weight = 1 )
8691 btn = Button (results_frame , text = kanji , font = font ,
8792 command = on_select_kanji (results_frame , kanji ))
88- btn .grid (column = i % rows , row = i // rows , sticky = "nsew" )
93+ btn .grid (column = col , row = row , sticky = "nsew" )
8994 results_frame .grid (row = 0 , column = 0 , sticky = "nsew" )
9095
9196 def on_select_kanji (results_frame , kanji ):
@@ -96,7 +101,8 @@ def handler():
96101 return handler
97102
98103 def draw_line (x1 , y1 , x2 , y2 ):
99- l = canvas .create_line (x1 , y1 , x2 , y2 , width = 5 , capstyle = tk .ROUND )
104+ l = canvas .create_line (x1 , y1 , x2 , y2 , width = LINEWIDTH ,
105+ capstyle = tk .ROUND )
100106 lines [- 1 ].append (l )
101107
102108 def disable_buttons ():
@@ -114,15 +120,15 @@ def copy_to_clipboard(text):
114120 win .clipboard_clear ()
115121 win .clipboard_append (text )
116122
117- draw_frame = Frame (win )
118- btns = Frame (draw_frame )
119- btn_undo = Button (btns , text = "Undo" , command = on_undo )
120- btn_clear = Button (btns , text = "Clear" , command = on_clear )
123+ draw_frame = Frame (win )
124+ btns = Frame (draw_frame )
125+ btn_undo = Button (btns , text = "Undo" , command = on_undo )
126+ btn_clear = Button (btns , text = "Clear" , command = on_clear )
121127 lbl_strokes = Label (btns , text = "Strokes: 0" )
122- btn_done = Button (btns , text = "Done" , command = on_done )
128+ btn_done = Button (btns , text = "Done" , command = on_done )
123129 disable_buttons ()
124130
125- canvas = Canvas (draw_frame , height = height , width = width , bg = bg )
131+ canvas = Canvas (draw_frame , height = HEIGHT , width = WIDTH , bg = BACKGROUND )
126132 canvas .bind ("<ButtonPress-1>" , on_mousedown )
127133 canvas .bind ("<B1-Motion>" , on_mousemove )
128134 canvas .bind ("<ButtonRelease-1>" , on_mouseup )
@@ -132,16 +138,22 @@ def copy_to_clipboard(text):
132138 btns .pack ()
133139 canvas .pack ()
134140 draw_frame .grid (row = 0 , column = 0 , sticky = "nsew" )
135-
136141 win .mainloop ()
137142 # }}}1
138143
144+ def main ():
145+ if "--version" in sys .argv :
146+ from .lib import __version__
147+ print ("{} v{}" .format (NAME , __version__ ))
148+ else :
149+ gui ()
150+
139151if __name__ == "__main__" :
140152 if "--doctest" in sys .argv :
141153 verbose = "--verbose" in sys .argv
142154 import doctest
143155 if doctest .testmod (verbose = verbose )[0 ]: sys .exit (1 )
144156 else :
145- tkinter_main ()
157+ main ()
146158
147159# vim: set tw=70 sw=2 sts=2 et fdm=marker :
0 commit comments