1
+ '''
2
+ simple tkinter app with an input text box
3
+ each 5 seconds thread will check if the input text box is changed
4
+ if changed, it will process the input text and show the result in the output text box
5
+ if user press ctrl+enter, it will force to process the input text and show the results in several output text boxes, per processing stage
6
+ '''
7
+ import tkinter as tk
8
+ import tkinter .scrolledtext as tkst
9
+ from core .worker import CWorker
10
+
11
+ class App (tk .Frame ):
12
+ def __init__ (self , master = None ):
13
+ super ().__init__ (master )
14
+ self ._master = master
15
+ # set global font
16
+ self ._master .option_add ("*Font" , ("Arial" , 16 ))
17
+ self ._master .title ("AI Enhanced Translator" )
18
+ self ._UI_init ()
19
+ self .pack ()
20
+
21
+ self ._worker = CWorker (self )
22
+ self ._worker .start ()
23
+ return
24
+
25
+ def _UI_inputArea (self , owner ):
26
+ label = tk .Label (owner , text = "Input Text:" , justify = "left" , anchor = "w" )
27
+ label .pack (side = "top" , fill = tk .X )
28
+
29
+ self ._inputText = tkst .ScrolledText (owner )
30
+ self ._inputText .pack (side = "top" , fill = tk .BOTH , expand = tk .YES )
31
+ self ._inputText .bind ("<Control-Return>" , self .onForceTranslate )
32
+ return
33
+
34
+ def UITextFor (self , text ):
35
+ return text
36
+
37
+ def _UI_outputArea (self , owner ):
38
+ # fast translation
39
+ label = tk .Label (owner , text = self .UITextFor ("Fast Translation:" ), justify = "left" , anchor = "w" )
40
+ label .pack (side = "top" , fill = tk .X )
41
+
42
+ self ._fastOutputText = tkst .ScrolledText (owner )
43
+ self ._fastOutputText .pack (side = "top" , fill = tk .BOTH , expand = tk .YES )
44
+
45
+ # full translation
46
+ label = tk .Label (owner , text = self .UITextFor ("Full Translation:" ), justify = "left" , anchor = "w" )
47
+ label .pack (side = "top" , fill = tk .X )
48
+
49
+ self ._fullOutputText = tkst .ScrolledText (owner )
50
+ self ._fullOutputText .pack (side = "top" , fill = tk .BOTH , expand = tk .YES )
51
+ return
52
+
53
+ def _UI_init (self ):
54
+ # Two vertical frames for input and output
55
+ leftFrame = tk .Frame (self ._master )
56
+ leftFrame .pack (side = "left" , fill = tk .BOTH , expand = tk .YES )
57
+ self ._UI_inputArea (leftFrame )
58
+
59
+ rightFrame = tk .Frame (self ._master )
60
+ rightFrame .pack (side = "right" , fill = tk .BOTH , expand = tk .YES )
61
+
62
+ self ._UI_outputArea (rightFrame )
63
+ return
64
+
65
+ def onForceTranslate (self , event ):
66
+ self ._worker .forceTranslate ()
67
+ return
68
+
69
+ # events for worker
70
+ def text (self ): return self ._inputText .get ("1.0" , tk .END )
71
+
72
+ def startTranslate (self , force = False ):
73
+ # set output text to "Processing..."
74
+ self ._fastOutputText .delete ("1.0" , tk .END )
75
+ self ._fastOutputText .insert (tk .END , self .UITextFor ("Processing..." ))
76
+ if force :
77
+ self ._fullOutputText .delete ("1.0" , tk .END )
78
+ self ._fullOutputText .insert (tk .END , self .UITextFor ("Processing..." ))
79
+ return
80
+
81
+ def fastTranslated (self , text ):
82
+ self ._fastOutputText .delete ("1.0" , tk .END )
83
+ self ._fastOutputText .insert (tk .END , text )
84
+ return
85
+
86
+ def fullTranslated (self , text ):
87
+ self ._fullOutputText .delete ("1.0" , tk .END )
88
+ self ._fullOutputText .insert (tk .END , text )
89
+ return
90
+
91
+ def error (self , e ):
92
+ self ._fastOutputText .delete ("1.0" , tk .END )
93
+ self ._fullOutputText .insert (tk .END , "Error: " + str (e ) + "\n " )
94
+ return
95
+
96
+ def endTranslate (self ):
97
+ return
98
+
99
+ if '__main__' == __name__ :
100
+ root = tk .Tk ()
101
+ app = App (master = root )
102
+ app .mainloop ()
0 commit comments