Statistiques
| Révision :

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()