Statistiques
| Révision :

root / ase / gui / pybutton.py @ 11

Historique | Voir | Annoter | Télécharger (2,3 ko)

1 1 tkerber
2 1 tkerber
"""pybutton.py - a button for displaying Python code.
3 1 tkerber

4 1 tkerber
This module defines two classes, together they implement a button that
5 1 tkerber
a module can use to display Python.
6 1 tkerber

7 1 tkerber
PyButton
8 1 tkerber
--------
9 1 tkerber

10 1 tkerber
PyButton is a gkt.Button with the label 'Python'.  When pressed, it
11 1 tkerber
opens a PyWindow displaying some Python code, or an error message if
12 1 tkerber
no Python code is ready.
13 1 tkerber

14 1 tkerber
The script is stored in the attribute .python, it is the
15 1 tkerber
responsability of the owning object to keep this attribute up to date:
16 1 tkerber
when pressing the Apply button would result in a sensible
17 1 tkerber
configuration being created, the python attribute must be set to a
18 1 tkerber
string creating this code.  When pressing Apply would cause an error,
19 1 tkerber
the python attribute must be set to None.
20 1 tkerber

21 1 tkerber
PyWindow
22 1 tkerber
--------
23 1 tkerber

24 1 tkerber
Displays the Python code.  This object is created by the PyButton
25 1 tkerber
object when needed.
26 1 tkerber
"""
27 1 tkerber
28 1 tkerber
import gtk
29 1 tkerber
import time
30 1 tkerber
from ase.gui.widgets import oops, pack
31 1 tkerber
32 1 tkerber
33 1 tkerber
class PyButton(gtk.Button):
34 1 tkerber
    "A button for displaying Python code."
35 1 tkerber
    def __init__(self, title):
36 1 tkerber
        gtk.Button.__init__(self, "Python")
37 1 tkerber
        self.title = title
38 1 tkerber
        self.python = None
39 1 tkerber
        self.connect_after('clicked', self.run)
40 1 tkerber
41 1 tkerber
    def run(self, *args):
42 1 tkerber
        "The method called when the button is click."
43 1 tkerber
        if self.python:
44 1 tkerber
            now = time.ctime()
45 1 tkerber
            win = PyWindow(self.title, now, self.python)
46 1 tkerber
        else:
47 1 tkerber
            oops("No Python code",
48 1 tkerber
                 "You have not (yet) specified a consistent set of parameters.")
49 1 tkerber
50 1 tkerber
fr1_template = """
51 1 tkerber
Title: %s
52 1 tkerber
Time: %s
53 1 tkerber
"""
54 1 tkerber
55 1 tkerber
class PyWindow(gtk.Window):
56 1 tkerber
    "A window displaying Python code."
57 1 tkerber
    def __init__(self, title, time, code):
58 1 tkerber
        gtk.Window.__init__(self)
59 1 tkerber
        self.set_title("ag: Python code")
60 1 tkerber
        vbox = gtk.VBox()
61 1 tkerber
        lbl = gtk.Label(fr1_template % (title, time))
62 1 tkerber
        lbl.set_alignment(0.0, 0.5)
63 1 tkerber
        fr = gtk.Frame("Information:")
64 1 tkerber
        fr.add(lbl)
65 1 tkerber
        pack(vbox, fr)
66 1 tkerber
        txtbuf = gtk.TextBuffer()
67 1 tkerber
        txtbuf.set_text(code)
68 1 tkerber
        txtview = gtk.TextView(txtbuf)
69 1 tkerber
        txtview.set_editable(False)
70 1 tkerber
        fr = gtk.Frame("Python code:")
71 1 tkerber
        fr.add(txtview)
72 1 tkerber
        fr.set_label_align(0.0, 0.5)
73 1 tkerber
        pack(vbox, fr)
74 1 tkerber
        but =  gtk.Button(stock=gtk.STOCK_OK)
75 1 tkerber
        but.connect('clicked', lambda x: self.destroy())
76 1 tkerber
        pack(vbox, [but], end=True, bottom=True)
77 1 tkerber
        self.add(vbox)
78 1 tkerber
        self.show_all()