Nog even een stukje toegevoegd, wat de huidige configuratie selecteerd. Heb je de knoppen links staan, dan staat links automatisch aan. Bij rechts, de radiobutton rechts. Als je zoals Lucid-1 hebt, dan wordt anders geselecteeerd
#!/usr/bin/env python
import pygtk
import gtk
import gconf
class ChangeButtonOrder:
'''De hoofdklasse van het programma (in dit geval is er maar 1)
Deze word onderaan het script aangeroepen met:
app = ChangeButtonOrder()
'''
def __init__(self):
'''Deze functie wordt meteen opgeroepen, zodra de klasse aangemaakt wordt'''
self.client = gconf.client_get_default ()
self.key = "/apps/metacity/general/button_layout"
# Maakt een hoofdvenster aan
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Sluit het programma als er op X wordt gedrukt
window.connect("delete_event", self.close_app)
# Zet de window titel
window.set_title("Vensterknoppen instellen...")
# Zet de afmetingen van het venster
window.resize(400, 140)
# Maakt een verticale layout, waarin verschillende items
# onder elkaar gestapeld kunnen worden
vbox = gtk.VBox()
# Vraagt of de gebruiker de key mag wijzigen en maakt de label aan met de juiste tekst
if self.client.key_is_writable(self.key):
label = gtk.Label("Kies een positie:")
else:
label = gtk.Label("U heeft geen rechten om de positie te veranderen")
# Zet het label bovenin het venster
vbox.pack_start(label, False, False, 8)
# Maakt een tabel met daarin de radio buttons en entry
if self.client.key_is_writable(self.key):
table = gtk.Table()
self.left = gtk.RadioButton(None, "Links")
self.left.connect('toggled', self.change_order)
self.right = gtk.RadioButton(self.left, "Rechts")
self.right.connect('toggled', self.change_order)
self.custom = gtk.RadioButton(self.left, "Andere:")
self.custom.connect('toggled', self.enable_custom)
self.entry = gtk.Entry()
# Vul de entry met de huidige waarde uit gconf
self.entry.set_text(self.client.get_string(self.key))
self.entry.set_sensitive(False)
# Voegt een knop toe om de custom entry toe te passen
self.buttonapply = gtk.Button(stock=gtk.STOCK_APPLY)
self.buttonapply.set_sensitive(False)
# Voert de functie "buttonapply_clicked" uit in deze(self) klasse (ChangeButtonOrder)
self.buttonapply.connect('clicked', self.change_order)
# Toggle de radio button naar de huidige status
self.toggle_current()
# Zet de posities in de tabel)
table.attach(self.left, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK)
table.attach(self.right, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK)
table.attach(self.custom, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK)
table.attach(self.entry, 1, 2, 2, 3, xpadding=10)
table.attach(self.buttonapply, 2, 3, 2, 3, gtk.FILL, gtk.SHRINK)
# Zet de tabel als 2e item in de verticale layout
vbox.pack_start(table, False, False)
# Maakt een knoppenbox aan
bbox = gtk.HButtonBox()
bbox.set_layout(gtk.BUTTONBOX_END)
buttonquit = gtk.Button(stock=gtk.STOCK_QUIT)
# Voert de functie "close_app" uit in deze(self) klasse (ChangeButtonOrder)
buttonquit.connect('clicked', self.close_app)
# Zet de button in de buttonbox
bbox.pack_start(buttonquit)
# Zet de buttonbox als laatste in de verticale layout
vbox.pack_start(bbox, False, False, 8)
# Voeg de verticale layout toe aan het hoofdvenster
window.add(vbox)
# Laat alle knoppen etc zien (want die zijn standaard verborgen)
window.show_all()
def close_app(self, widget, event=None):
'''Functie die het programma afsluit'''
gtk.main_quit()
return False
def change_order(self, widget):
'''Functie die de waarden in gconf veranderd'''
if self.left.get_active(): # als "links" gekozen is
s = "maximize,minimize,close:menu"
elif self.right.get_active(): # als "rechts" gekozen is
s = "menu:maximize,minimize,close"
else:
s = self.entry.get_text()
# Zet de nieuwe waarde in gconf
self.client.set_string(self.key, s)
# Vul de entry met de nieuwe waarde
self.entry.set_text(s)
def enable_custom(self, widget):
# Maakt de entry en apply button actief als "anders" is aangevinkt
self.entry.set_sensitive(widget.get_active())
self.buttonapply.set_sensitive(widget.get_active())
def toggle_current(self):
# Toggle de radio button naar de huidige status
key = self.client.get_string(self.key)
if key.find('maximize,minimize,close:') is not -1:
self.left.set_active(True)
elif key.find(':maximize,minimize,close') is not -1:
self.right.set_active(True)
else:
self.custom.set_active(True)
# Geen idee wat het precies doet
# maar dit hoort gewoon zo in elke gtk app
def main():
gtk.main()
# Voer alleen uit als dit het main script is
# dus niet als deze vanuit een ander script opgeroepen wordt
if __name__ == '__main__':
# Defineer het programma
app = ChangeButtonOrder()
# Start het programma
main()
EDIT: verhelsttje, misschien een leuke oefening om een soort van reset knop te maken, die de waarde terug zet naar de waarde waarmee het programma begonnen is.