root / ase / gui / pybutton.py @ 4
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()
|