1
2
3 import Tkinter
4
5 -class MainWindow(object):
6 """Main window of application."""
7
8 - def __init__(self,system,controllers,processes):
9 self.system = system
10 self.root = Tkinter.Tk()
11 self.root.title("Inverted Pendulum")
12 self.root.minsize(400,200)
13
14 self.controller_nr = Tkinter.IntVar(0)
15 self.controllers = controllers
16 def Controller_Changed(name,index,mode):
17 self.Controller_Changed()
18 self.controller_nr.trace_variable('w',Controller_Changed)
19
20 self.process_nr = Tkinter.IntVar(0)
21 self.processes = processes
22 def Process_Changed(name,index,mode):
23 self.Process_Changed()
24 self.process_nr.trace_variable('w',Process_Changed)
25
26 menubar = Tkinter.Menu(self.root)
27
28 file_menu = Tkinter.Menu(menubar,tearoff=0)
29 file_menu.add_command(label="Quit",underline=0,command=self.File_Quit,accelerator="Ctrl+Q")
30 menubar.add_cascade(label="File",underline=0,menu=file_menu)
31 self.root.bind('<Control-q>',self.File_Quit)
32
33 self.run_menu = Tkinter.Menu(menubar,tearoff=0)
34 self.run_menu.add_command(label="Start", command=self.Run_Start,accelerator="F5")
35 self.run_menu.add_command(label="Step", command=self.Run_Step,accelerator="F11")
36 self.run_menu.add_command(label="Stop", command=self.Run_Stop,accelerator="Shift+F5")
37 menubar.add_cascade(label="Run",underline=0,menu=self.run_menu)
38 self.root.bind('<F5>',self.Run_Start)
39 self.root.bind('<F11>',self.Run_Step)
40 self.root.bind('<Shift-F5>',self.Run_Stop)
41
42 process_menu = Tkinter.Menu(menubar,tearoff=0)
43 process_menu.add_command(label="View",underline=0, command=self.Process_View,accelerator="V")
44 self.root.bind('<v>',self.Process_View)
45 i = 0
46 for process in processes:
47 process_menu.add_separator()
48 process_menu.add_radiobutton(label=process[0],underline=0, variable=self.process_nr,value=i)
49 if process[2]:
50
51 def Show(process=process):
52 process[2](process[1])
53 process_menu.add_command(label="... Parameter",underline=4, command=Show)
54 i = i + 1
55 menubar.add_cascade(label="Process",underline=0,menu=process_menu)
56
57 controller_menu = Tkinter.Menu(menubar,tearoff=0)
58 i = 0
59 for controller in controllers:
60 controller_menu.add_radiobutton(label=controller[0],underline=0, variable=self.controller_nr,value=i)
61 i = i + 1
62 menubar.add_cascade(label="Controller",underline=0,menu=controller_menu)
63
64
65 help_menu = Tkinter.Menu(menubar,tearoff=0)
66 help_menu.add_command(label="About",underline=0, command=self.Help_About,accelerator="F1")
67 menubar.add_cascade(label="Help",underline=0,menu=help_menu)
68 self.root.bind('<F1>',self.Help_About)
69
70 self.controller_nr.set(0)
71 self.process_nr.set(0)
72
73 self.root.config(menu=menubar)
74
75 Tkinter.Label(self.root,text=
76 """
77 The following keys are defined:
78
79 Ctrl+Q Exit
80 V Show visualization
81 F5 Start simulation
82 Shift+F5 Stop simulation
83 F11 Single step of simulation
84 """,justify=Tkinter.LEFT).pack()
85
86 self.root.mainloop()
87
88
89 - def File_Quit(self,event=None):
91
92 - def Run_Start(self,event=None):
94
95 - def Run_Stop(self,event=None):
97
98 - def Run_Step(self,event=None):
100
101 - def Process_View(self,event=None):
102 import ProcessView
103 ProcessView.Open(self.system)
104
105 - def Help_About(self,event=None):
106 import About
107 About.Open()
108
110 nr = self.controller_nr.get()
111 print "Set controller %d: %s %s" % (nr,self.controllers[nr][0],self.controllers[nr][1])
112 self.system.controller = self.controllers[nr][1]
113
114 - def Process_Changed(self):
115 nr = self.process_nr.get()
116 print "Set process %d: %s %s" % (nr,self.processes[nr][0],self.processes[nr][1])
117 self.system.process = self.processes[nr][1]
118