root / prepareQMX / prepareQMX.GUI.py @ 10
Historique | Voir | Annoter | Télécharger (7,32 ko)
1 | 10 | tkerber | #!/usr/bin/env python
|
---|---|---|---|
2 | 10 | tkerber | |
3 | 10 | tkerber | # GRAPHICAL interface for setup of QMX calculations
|
4 | 10 | tkerber | #
|
5 | 10 | tkerber | # Torsten Kerber, ENS LYON: 2011, 07, 11
|
6 | 10 | tkerber | #
|
7 | 10 | tkerber | # This work is supported by Award No. UK-C0017, made by King Abdullah
|
8 | 10 | tkerber | # University of Science and Technology (KAUST)
|
9 | 10 | tkerber | |
10 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
11 | 10 | tkerber | from Tkinter import * |
12 | 10 | tkerber | from copy import deepcopy |
13 | 10 | tkerber | import StringIO, os |
14 | 10 | tkerber | |
15 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
16 | 10 | tkerber | from qmxEMBED import embedDefinitions |
17 | 10 | tkerber | from qmxJOB import jobDefinitions |
18 | 10 | tkerber | from qmxSTR import strDefinitions |
19 | 10 | tkerber | from qmxCALC import calcDefinitions, QmxCalcDefinition |
20 | 10 | tkerber | |
21 | 10 | tkerber | from qmxWRITE import writeData |
22 | 10 | tkerber | |
23 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
24 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
25 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
26 | 10 | tkerber | class MyLabelFrame(LabelFrame): |
27 | 10 | tkerber | def __init__(self, mainWnd, master, title, def_list, extras): |
28 | 10 | tkerber | LabelFrame.__init__(self, master, text=title)
|
29 | 10 | tkerber | self.mainWnd = mainWnd
|
30 | 10 | tkerber | self.definitions=[]
|
31 | 10 | tkerber | self.title = title
|
32 | 10 | tkerber | |
33 | 10 | tkerber | for definition in def_list: |
34 | 10 | tkerber | definition_new = deepcopy(definition) |
35 | 10 | tkerber | definition_new.system = title |
36 | 10 | tkerber | self.definitions.append(definition_new)
|
37 | 10 | tkerber | |
38 | 10 | tkerber | fields=['import', 'class', 'class.options'] |
39 | 10 | tkerber | if extras is not None: |
40 | 10 | tkerber | for key in extras: |
41 | 10 | tkerber | fields.append(key) |
42 | 10 | tkerber | |
43 | 10 | tkerber | self.entries=[]
|
44 | 10 | tkerber | for key in fields: |
45 | 10 | tkerber | text=StringVar() |
46 | 10 | tkerber | text.set('')
|
47 | 10 | tkerber | self.entries.append((key, text, Entry(self, textvariable=text, width=15))) |
48 | 10 | tkerber | |
49 | 10 | tkerber | def grid(self, **arguments): |
50 | 10 | tkerber | LabelFrame.grid(self, arguments, sticky=(N+W+E))
|
51 | 10 | tkerber | self.listbox.selection_set(first=0) |
52 | 10 | tkerber | self.select(None) |
53 | 10 | tkerber | |
54 | 10 | tkerber | def doLayout(self): |
55 | 10 | tkerber | irow=0
|
56 | 10 | tkerber | for (key, text, textfield) in self.entries: |
57 | 10 | tkerber | Label(self, text=key, width=15, anchor=W).grid(row=irow) |
58 | 10 | tkerber | textfield.grid(row=irow, column=1)
|
59 | 10 | tkerber | textfield.bind("<KeyRelease>", self.update) |
60 | 10 | tkerber | irow+=1
|
61 | 10 | tkerber | |
62 | 10 | tkerber | scrollbar=Scrollbar(self, orient=VERTICAL)
|
63 | 10 | tkerber | self.listbox=Listbox(self, yscrollcommand=scrollbar.set, height=0, width=15, selectmode=SINGLE) |
64 | 10 | tkerber | self.listbox.grid(row=0, column=2, rowspan=irow, columnspan=2, sticky=NS) |
65 | 10 | tkerber | self.listbox.bind('<ButtonRelease-1>', self.select) |
66 | 10 | tkerber | |
67 | 10 | tkerber | scrollbar.config(command=self.listbox.yview)
|
68 | 10 | tkerber | scrollbar.grid(row=0, column=4, rowspan=irow, sticky=NS) |
69 | 10 | tkerber | |
70 | 10 | tkerber | for item in self.definitions: |
71 | 10 | tkerber | self.listbox.insert(END, item.name)
|
72 | 10 | tkerber | |
73 | 10 | tkerber | def select(self, event): |
74 | 10 | tkerber | selection=self.listbox.curselection()
|
75 | 10 | tkerber | if len(selection) == 1: |
76 | 10 | tkerber | self.curr_definition=deepcopy(self.definitions[int(selection[0])]) |
77 | 10 | tkerber | for (key, text, textfield) in self.entries: |
78 | 10 | tkerber | text.set(self.curr_definition.getValue(key))
|
79 | 10 | tkerber | self.mainWnd.preview()
|
80 | 10 | tkerber | |
81 | 10 | tkerber | def getSelection(self): |
82 | 10 | tkerber | return self.curr_definition |
83 | 10 | tkerber | |
84 | 10 | tkerber | def update(self, event): |
85 | 10 | tkerber | for (key, text, textfield) in self.entries: |
86 | 10 | tkerber | self.curr_definition.keywords[key]=text.get()
|
87 | 10 | tkerber | self.mainWnd.preview()
|
88 | 10 | tkerber | |
89 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
90 | 10 | tkerber | class MainWindow(Frame): |
91 | 10 | tkerber | frames=[] |
92 | 10 | tkerber | text=None
|
93 | 10 | tkerber | def __init__(self, master): |
94 | 10 | tkerber | Frame.__init__(self, master)
|
95 | 10 | tkerber | |
96 | 10 | tkerber | #--- Structures ---
|
97 | 10 | tkerber | bigFrame = LabelFrame(self, text='Structures') |
98 | 10 | tkerber | irow=0; icol=0 |
99 | 10 | tkerber | def_list=embedDefinitions |
100 | 10 | tkerber | extras=['method', 'method.options', 'calculator'] |
101 | 10 | tkerber | frame=MyLabelFrame(self, bigFrame, 'Embed', def_list, extras) |
102 | 10 | tkerber | frame.doLayout() |
103 | 10 | tkerber | frame.grid(row=irow, column=icol) |
104 | 10 | tkerber | self.frames.append(frame)
|
105 | 10 | tkerber | |
106 | 10 | tkerber | icol+=1;
|
107 | 10 | tkerber | for label in ['System', 'Cluster']: |
108 | 10 | tkerber | def_list=strDefinitions |
109 | 10 | tkerber | frame=MyLabelFrame(self, bigFrame, label, def_list, None) |
110 | 10 | tkerber | frame.doLayout() |
111 | 10 | tkerber | frame.grid(row=irow, column=icol) |
112 | 10 | tkerber | self.frames.append(frame)
|
113 | 10 | tkerber | icol+=1
|
114 | 10 | tkerber | bigFrame.grid(row=0, columnspan=3) |
115 | 10 | tkerber | |
116 | 10 | tkerber | #--- Methods ---
|
117 | 10 | tkerber | bigFrame = LabelFrame(self, text='Methods') |
118 | 10 | tkerber | irow=0; icol=0 |
119 | 10 | tkerber | def_list=[QmxCalcDefinition()] |
120 | 10 | tkerber | frame=MyLabelFrame(self, bigFrame, 'Qmx', def_list, None) |
121 | 10 | tkerber | frame.doLayout() |
122 | 10 | tkerber | frame.grid(row=irow, column=icol) |
123 | 10 | tkerber | self.frames.append(frame)
|
124 | 10 | tkerber | |
125 | 10 | tkerber | icol+=1
|
126 | 10 | tkerber | for label in ['High-Level', 'Low-Level']: |
127 | 10 | tkerber | def_list=calcDefinitions |
128 | 10 | tkerber | frame=MyLabelFrame(self, bigFrame, label, def_list, None) |
129 | 10 | tkerber | frame.doLayout() |
130 | 10 | tkerber | frame.grid(row=irow, column=icol) |
131 | 10 | tkerber | self.frames.append(frame)
|
132 | 10 | tkerber | icol+=1
|
133 | 10 | tkerber | bigFrame.grid(row=1, columnspan=3) |
134 | 10 | tkerber | |
135 | 10 | tkerber | #--- General ---
|
136 | 10 | tkerber | bigFrame = LabelFrame(self, text='General') |
137 | 10 | tkerber | extras=['method', 'method.options'] |
138 | 10 | tkerber | frame=MyLabelFrame(self, bigFrame, 'Job', jobDefinitions, extras) |
139 | 10 | tkerber | frame.doLayout() |
140 | 10 | tkerber | frame.grid() |
141 | 10 | tkerber | self.frames.append(frame)
|
142 | 10 | tkerber | bigFrame.grid(row=2, sticky=NW)
|
143 | 10 | tkerber | |
144 | 10 | tkerber | frame=LabelFrame(self, text="PREVIEW") |
145 | 10 | tkerber | scrollbar=Scrollbar(frame, orient=VERTICAL) |
146 | 10 | tkerber | scrollbar.set(0.0, 1.0) |
147 | 10 | tkerber | self.text=Text(frame, yscrollcommand=scrollbar.set, width=60, heigh=10, state=DISABLED) |
148 | 10 | tkerber | self.text.grid(sticky=(N+W+S+E))
|
149 | 10 | tkerber | scrollbar.config(command=self.text.yview)
|
150 | 10 | tkerber | scrollbar.grid(row=0, column=1, sticky=NS) |
151 | 10 | tkerber | frame.grid(row=2, column=1) |
152 | 10 | tkerber | |
153 | 10 | tkerber | frame = Frame(self)
|
154 | 10 | tkerber | |
155 | 10 | tkerber | image = PhotoImage(file="exit.gif")
|
156 | 10 | tkerber | buttonExit=Button(frame, image=image, command=self.quit)
|
157 | 10 | tkerber | buttonExit.image = image |
158 | 10 | tkerber | buttonExit.grid(row=1, column = 1, rowspan=2, sticky= W+E+N+S) |
159 | 10 | tkerber | |
160 | 10 | tkerber | buttonSave=Button(frame, text='save settings', state=DISABLED)
|
161 | 10 | tkerber | buttonSave.grid(row=1, column = 2, sticky=(EW)) |
162 | 10 | tkerber | |
163 | 10 | tkerber | buttonPrint=Button(frame, text='Write qmx.py input file', command=self.writeButton) |
164 | 10 | tkerber | buttonPrint.grid(row=2, column = 2, sticky=EW) |
165 | 10 | tkerber | |
166 | 10 | tkerber | frame.grid(row=2, column=2, sticky=SE) |
167 | 10 | tkerber | |
168 | 10 | tkerber | #--- MainWindow ---
|
169 | 10 | tkerber | self.grid(sticky=(W+N+S+E))
|
170 | 10 | tkerber | self.preview()
|
171 | 10 | tkerber | |
172 | 10 | tkerber | def quit(self): |
173 | 10 | tkerber | quit() |
174 | 10 | tkerber | |
175 | 10 | tkerber | def writeButton(self): |
176 | 10 | tkerber | file = open("qmx.py","w") |
177 | 10 | tkerber | definitions=[] |
178 | 10 | tkerber | for frame in self.frames: |
179 | 10 | tkerber | definition = frame.getSelection() |
180 | 10 | tkerber | if definition is not None: |
181 | 10 | tkerber | definitions.append(definition) |
182 | 10 | tkerber | |
183 | 10 | tkerber | writeData(file, definitions)
|
184 | 10 | tkerber | file.close()
|
185 | 10 | tkerber | os.system("chmod u+x qmx.py")
|
186 | 10 | tkerber | |
187 | 10 | tkerber | def preview(self): |
188 | 10 | tkerber | stream = StringIO.StringIO() |
189 | 10 | tkerber | definitions=[] |
190 | 10 | tkerber | for frame in self.frames: |
191 | 10 | tkerber | definition = frame.getSelection() |
192 | 10 | tkerber | if definition is not None: |
193 | 10 | tkerber | definitions.append(definition) |
194 | 10 | tkerber | |
195 | 10 | tkerber | writeData(stream, definitions) |
196 | 10 | tkerber | s = stream.getvalue() |
197 | 10 | tkerber | |
198 | 10 | tkerber | if self.text is not None: |
199 | 10 | tkerber | pos, end = self.text.yview()
|
200 | 10 | tkerber | self.text.config(state=NORMAL)
|
201 | 10 | tkerber | self.text.delete(1.0, END) |
202 | 10 | tkerber | self.text.insert(END, s)
|
203 | 10 | tkerber | self.text.config(state=DISABLED)
|
204 | 10 | tkerber | self.text.yview(MOVETO, pos)
|
205 | 10 | tkerber | |
206 | 10 | tkerber | #---------------------------------------------------------------------------------------------------
|
207 | 10 | tkerber | mainWnd=MainWindow(Tk()) |
208 | 10 | tkerber | mainWnd.mainloop() |