Testen, ob Variabel existiert
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Momentan habe ich ein Problem mit meiner Logik. Sie funktioniert gerade nicht. ;-) Folgendes Szenario: Ich teste, ob verschiedene Programme vorhanden sind. Ist eines dieser Programme vorhanden, wird mit pygtk ein RadioButton für dieses Programm erzeugt. Zur Gruppenzuordnung wird nochmal getestet, ob die Variabel group einen Inhalt hat. Ist dies nicht der Fall, bekommt group die Namen des RadioButtons für das erste gefundene Programm zugewiesen. Damit ich das Programm jetzt noch starten kann, muss ich herausfinden, welcher RadioButton aktiv ist. Aber alles, was mir bisher eingefallen ist, hat nicht funktioniert. So sieht der Test aus, ob das Programm existiert. Da verschiedene Pfade in Frage kommen, habe ich diese in seperate Variabeln gepackt. if access(pfad1+'/progname', X_OK) or access(pfad2+'/progname', X_OK): if group: rbprogname = gtk.RadioButton(label = 'ProgName', group = group) else: rbprogname = gtk.RadioButton(label = 'ProgName') group = rbprogname vbox1.pack_start(rbprogname) progname ist im Skript immer der Name des gesuchten Programms. Kann jemand meiner Logik auf die Sprünge helfen? Die einzige Möglichkeit, die mir noch einfällt, wäre alle Variabeln (die rbprogname) bereits am Anfang des Skriptes zu definieren und dann, wenn das Programm existiert, zu überschreiben. Aber es gibt doch bestimmt eine bessere Lösung, oder? Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
if access(pfad1+'/progname', X_OK) or access(pfad2+'/progname', X_OK): if group: rbprogname = gtk.RadioButton(label = 'ProgName', group = group) else: rbprogname = gtk.RadioButton(label = 'ProgName') group = rbprogname vbox1.pack_start(rbprogname)
progname ist im Skript immer der Name des gesuchten Programms.
Kann jemand meiner Logik auf die Sprünge helfen?
Wieso verwendest du keine dicts? progs = {} if access(pfad1+'/progname', X_OK) or access(pfad2+'/progname', X_OK): if group: progs[rbprogname] = gtk.RadioButton(label = 'ProgName', group = group) else: progs[rbprogname] = gtk.RadioButton(label = 'ProgName') group = progs[rbprogname] vbox1.pack_start(progs[rbprogname]) Wobei die Sache mit der Variablen group mir nicht ganz klar ist. Ausserdem ist dein acces-test nicht besonders clever - was wenn du mehr als 2 Pfade hast? Da sollte eine Liste hin - ungefaehr so: paths = ["pfad1", "pfad2"] prognames = ["prog1", "prog2] for progname in prognames: found = False for path in paths: if access(os.path.join(path, progname)): break print "Found %s at %s" % (progname, path) MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Kleine Korrektur: paths = ["pfad1", "pfad2"] prognames = ["prog1", "prog2] for progname in prognames: found = False for path in paths: if access(os.path.join(path, progname)): Found = True break if Found: print "Found %s at %s" % (progname, path) else: print "%s not found." % (progname, path) MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Fre, den 03.09.2004 um 20:17 Uhr +0200 schrieb Diez B. Roggisch:
if access(pfad1+'/progname', X_OK) or access(pfad2+'/progname', X_OK): if group: rbprogname = gtk.RadioButton(label = 'ProgName', group = group) else: rbprogname = gtk.RadioButton(label = 'ProgName') group = rbprogname vbox1.pack_start(rbprogname)
progname ist im Skript immer der Name des gesuchten Programms.
Kann jemand meiner Logik auf die Sprünge helfen?
Wieso verwendest du keine dicts?
progs = {} if access(pfad1+'/progname', X_OK) or access(pfad2+'/progname', X_OK): if group: progs[rbprogname] = gtk.RadioButton(label = 'ProgName', group = group) else: progs[rbprogname] = gtk.RadioButton(label = 'ProgName') group = progs[rbprogname] vbox1.pack_start(progs[rbprogname])
Weil ich nicht so wirklich die Ahnung habe. :-( Bis eben habe ich noch nie etwas von dicts gehört. Muss mich darüber mal schlau machen. Laut meinem schlauen Büchlein werden dicts mit dict() oder dict(Inhalt) aufgerufen. Warum verwendest du hier progs = {} ?
Wobei die Sache mit der Variablen group mir nicht ganz klar ist.
Ich muss doch bei gtk.RadioButton eine Gruppe von RadioButton angeben, wenn immer nur ein RadioButton aktiv sein darf. Wenn ich die Gruppe auf ProgA beziehe, kann es ein Problem geben, wenn ProgA nicht existiert, sondern erst ProbB. Die Übergabe der Variabel group für die Gruppe schien mir am einfachsten. Bzw. war die einzige Lösung, die mir eingefallen ist.
Ausserdem ist dein acces-test nicht besonders clever - was wenn du mehr als 2 Pfade hast? Da sollte eine Liste hin - ungefaehr so:
Es gibt nur, oder hat nur vier Pfadmöglichkeiten zu geben. ;-) Und die habe ich jeweils mit pfad1 bis pfad4 in eine Variabel gepackt. Damits nicht so lang wird, hab ich hier die letzten Zwei unterschlagen. Aber wegen die vier Möglichkeiten habe ich ja auch jeweils or mit eingebaut.
paths = ["pfad1", "pfad2"] prognames = ["prog1", "prog2]
for progname in prognames: found = False for path in paths: if access(os.path.join(path, progname)): break print "Found %s at %s" % (progname, path)
Das muss ich mir noch genauer anschauen. Auf den ersten Blick und meinem Verständnis müsste ich das doch sowohl für mein Problem, als auch für die Tests nehmen können. Oder bin ich voll verpeilt? Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Weil ich nicht so wirklich die Ahnung habe. :-( Bis eben habe ich noch nie etwas von dicts gehört. Muss mich darüber mal schlau machen.
Laut meinem schlauen Büchlein werden dicts mit dict() oder dict(Inhalt) aufgerufen. Warum verwendest du hier progs = {} ?
Aeh - man kann dicts auch mit dict() erzeugen und zB (shallow) kopieren - aber ueblicherweise benutzt man die eingebauten Konstruktoren {}. Ehrlich gesagt ist es etwas erschreckend, das du von dictionaries nix gehoert hast - ich empfehle dir _dringend_ das python-tutorial mal durchzuarbeiten. Denn dicts sind dermassen grundlegend, das zu befuerchten ist das du sonstewas fuer Klimmzuege machst in deinem Code, wenn du sie nicht betutzt.
Ich muss doch bei gtk.RadioButton eine Gruppe von RadioButton angeben, wenn immer nur ein RadioButton aktiv sein darf. Wenn ich die Gruppe auf ProgA beziehe, kann es ein Problem geben, wenn ProgA nicht existiert, sondern erst ProbB.
Die Übergabe der Variabel group für die Gruppe schien mir am einfachsten. Bzw. war die einzige Lösung, die mir eingefallen ist.
Ich verstehe das immer noch nicht - was willst du denn wie gruppieren?
Es gibt nur, oder hat nur vier Pfadmöglichkeiten zu geben. ;-) Und die habe ich jeweils mit pfad1 bis pfad4 in eine Variabel gepackt. Damits nicht so lang wird, hab ich hier die letzten Zwei unterschlagen. Aber wegen die vier Möglichkeiten habe ich ja auch jeweils or mit eingebaut.
Na, das ist aber sehr blauaeugig - warum genau 4? Und bloss weil es dann mal doch 5 sind den Code an tausend Stellen anfassen muessen? Das ist schlecht - besser eine (globale) Liste, die die Suchpfade enthaelt. Die muss man dann nur einmal anpassen - eventuell sogar per config. Hast du denn wenigstens mit Listen zu tun gehabt bisher?
paths = ["pfad1", "pfad2"] prognames = ["prog1", "prog2]
for progname in prognames: found = False for path in paths: if access(os.path.join(path, progname)): break print "Found %s at %s" % (progname, path)
Das muss ich mir noch genauer anschauen. Auf den ersten Blick und meinem Verständnis müsste ich das doch sowohl für mein Problem, als auch für die Tests nehmen können.
Klar, innerhalb des if Found: in meinem korrigierten Beispeil steht praktisch der Code fuer die gui-elemente. Das dict muss nat. vorher nur einmal initialisiert werden. MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Am Fre, den 03.09.2004 um 21:39 Uhr +0200 schrieb Diez B. Roggisch:
Weil ich nicht so wirklich die Ahnung habe. :-( Bis eben habe ich noch nie etwas von dicts gehört. Muss mich darüber mal schlau machen.
Laut meinem schlauen Büchlein werden dicts mit dict() oder dict(Inhalt) aufgerufen. Warum verwendest du hier progs = {} ?
Aeh - man kann dicts auch mit dict() erzeugen und zB (shallow) kopieren - aber ueblicherweise benutzt man die eingebauten Konstruktoren {}.
Ehrlich gesagt ist es etwas erschreckend, das du von dictionaries nix gehoert hast - ich empfehle dir _dringend_ das python-tutorial mal durchzuarbeiten. Denn dicts sind dermassen grundlegend, das zu befuerchten ist das du sonstewas fuer Klimmzuege machst in deinem Code, wenn du sie nicht betutzt.
Vielleicht habe ich es ja gelesen, als ich angefangen habe mich mit Python zu beschäftigen. Mein Problem ist aber, dass ich derartige Sachen erst dann lerne, wenn ich sie auch wirklich benutze. Also nur lesen bringt nix. Und den Code stur abtippen hat mir auch nicht geholfen. Was die Klimmzüge angeht: Schau dir mal http://de.geocities.com/bmh1980de/pyrpmbuilder-0.1.tar.gz an. Das war mein erstes Python-Skript. Sogar ich, mit meinem fehlendem Wissen finde, dass da eine Menge Klimmzüge drinn sind. :-( Leider!
Ich muss doch bei gtk.RadioButton eine Gruppe von RadioButton angeben, wenn immer nur ein RadioButton aktiv sein darf. Wenn ich die Gruppe auf ProgA beziehe, kann es ein Problem geben, wenn ProgA nicht existiert, sondern erst ProbB.
Die Übergabe der Variabel group für die Gruppe schien mir am einfachsten. Bzw. war die einzige Lösung, die mir eingefallen ist.
Ich verstehe das immer noch nicht - was willst du denn wie gruppieren?
Hier mal einen Auszug aus der PyGTK FAQ. Da habe ich das mit der Gruppe nämlich her. [Ausschnitt PyGTK FAQ] 9.1. How does one group radio buttons to allow only one concurrent button to be depressed? GtkRadioButton() has a group parameter that defaults to None. The first button in the group is the group parameter for the remaining buttons. So you would do something like: w = gtk.GtkWindow() v = gtk.GtkVBox() b1 = gtk.GtkRadioButton(label="Cows") b2 = gtk.GtkRadioButton(label="Dogs", group=b1) b3 = gtk.GtkRadioButton(label="Mountains", group=b1) v.add(b1) v.add(b2) v.add(b3) w.add(v) w.show_all() [/Ausschnitt PyGTK FAQ]
Es gibt nur, oder hat nur vier Pfadmöglichkeiten zu geben. ;-) Und die habe ich jeweils mit pfad1 bis pfad4 in eine Variabel gepackt. Damits nicht so lang wird, hab ich hier die letzten Zwei unterschlagen. Aber wegen die vier Möglichkeiten habe ich ja auch jeweils or mit eingebaut.
Na, das ist aber sehr blauaeugig - warum genau 4? Und bloss weil es dann mal doch 5 sind den Code an tausend Stellen anfassen muessen? Das ist schlecht - besser eine (globale) Liste, die die Suchpfade enthaelt. Die muss man dann nur einmal anpassen - eventuell sogar per config.
Warum ist das blauäugig? Unter Linux (besser gesagt hier Slackware) gibt es nur pfad1=/usr/bin pfad2=/usr/local/bin pfad3=/usr/X11R6/bin pfad4=/opt/kde/bin, wo die Programme liegen könnten.
Hast du denn wenigstens mit Listen zu tun gehabt bisher?
Abgesehen von dem oben genannte Skript (pyrpmbuilder.py) war es noch nicht notwendig mit Listen zu arbeiten. Und bei pyrpmbuilder.py wusste ich nicht, wie ich diese anwenden muss. Allerdings hat sich auch nicht sehr viel daran geändert. Meine letzten Skripte waren für GUIs, die ich mit Glade erstellt habe. Daher waren diese Skripte sehr kurz und in erster Linie Frontends für z. B. gconftool-2. [...]
Das muss ich mir noch genauer anschauen. Auf den ersten Blick und meinem Verständnis müsste ich das doch sowohl für mein Problem, als auch für die Tests nehmen können.
Klar, innerhalb des
if Found:
in meinem korrigierten Beispeil steht praktisch der Code fuer die gui-elemente. Das dict muss nat. vorher nur einmal initialisiert werden.
Wenn ich das aus der Python-Hilfe richtig verstehe, ist der Inhalt von dict() bei deinem Beispiel alles, was in [] geschrieben ist. Oder liege ich da falsch? Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/5238a3732fd7663851110f536394a5c6.jpg?s=120&d=mm&r=g)
Hi, Marcus Habermehl wrote:
Warum ist das blauäugig? Unter Linux (besser gesagt hier Slackware) gibt es nur
pfad1=/usr/bin pfad2=/usr/local/bin pfad3=/usr/X11R6/bin pfad4=/opt/kde/bin,
wo die Programme liegen könnten.
Und genau das ist blauäugig! Darum: * In obiger Liste fehlen schon man /sbin, /usr/sbin, /usr/local/sbin. * Damit läuft das Programm nur auf dieser Version diese OS in der Konfiguration. Was machst Du, wenn der Anwender eine der Anwendungen in seinem Home installiert hat? * Unter Unix wird der Suchpfad in $PATH festgelegt. Jedes Programm sollte dann auch diese Variable auswerten. Mein PATH sieht beispielsweise so aus: [hartmut@goebel02 hartmut]$ echo $PATH /bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/home/hartmut/bin Regel: Nichts hardcoden, bei dem die Wahrscheinlichkeit groß ist, dass es sich ändert. -- Schönen Gruß - Regards Hartmut Goebel | Hartmut Goebel | IT-Security -- effizient | | h.goebel@goebel-consult.de | www.goebel-consult.de | _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Sam, den 04.09.2004 um 12:43 Uhr +0200 schrieb Hartmut Goebel:
Marcus Habermehl wrote:
Warum ist das blauäugig? Unter Linux (besser gesagt hier Slackware) gibt es nur
pfad1=/usr/bin pfad2=/usr/local/bin pfad3=/usr/X11R6/bin pfad4=/opt/kde/bin,
wo die Programme liegen könnten.
Und genau das ist blauäugig! Darum:
* In obiger Liste fehlen schon man /sbin, /usr/sbin, /usr/local/sbin.
Des es sich bei den gesuchten Programme handelt, dürften die sbin Verzeichnisse keine Rolle spielen. Habe es zumindest noch nicht erlebt, dass ein WM in [/usr|/usr/local]/sbin installiert war.
* Damit läuft das Programm nur auf dieser Version diese OS in der Konfiguration. Was machst Du, wenn der Anwender eine der Anwendungen in seinem Home installiert hat?
Ich weiß zwar, dass man etwas nach ${HOME}/bin installieren/kopieren und ausführen kann. Aber da ich bisher von vielen Seiten gehört habe, dass man das aus Sicherheitsgründen nicht machen soll, habe ich diesen Pfad immer ignoriert und notfalls gelöscht.
* Unter Unix wird der Suchpfad in $PATH festgelegt. Jedes Programm sollte dann auch diese Variable auswerten. Mein PATH sieht beispielsweise so aus:
[hartmut@goebel02 hartmut]$ echo $PATH /bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/home/hartmut/bin
Regel: Nichts hardcoden, bei dem die Wahrscheinlichkeit groß ist, dass es sich ändert.
Ich habe mir ja schön öffter mal überlegt, ${PATH} in meine Skripte einzulesen. Bisher war ${PATH} allerdings noch nicht wichtig. Es wäre wohl am besten, wenn ich die Variabel paths aus deinem Beispiel so benutze, oder? paths = os.getenv('PATH').split(':') Somit dürgen Änderungen am Code nicht nötig sein, da es ja, wie es richtig sein sollte, über ${PATH} gesteuert wird, aus welchen Verzeichnissen ein User etwas ausführen darf. Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Hallo,
Ich weiß zwar, dass man etwas nach ${HOME}/bin installieren/kopieren und ausführen kann. Aber da ich bisher von vielen Seiten gehört habe, dass man das aus Sicherheitsgründen nicht machen soll, habe ich diesen Pfad immer ignoriert und notfalls gelöscht.
Haeh? Das ist mumpitz. Aus Sicherheitsgruenden sollte ein Benutzer niemals einen Pfad haben, der Programme anderer Nutzer enthaelt. Also zB root niemals den Punkt (.) - sonst legt jemand eine "ls" benannte Datei in sein Verzeichnis, und schwups hatter root-Rechte. Aber was du da gehoert zu haben glaubst ist falsch - ich zB habe den kompletten KDE lokal im home, um die neueste Version zu nutzen statt die debian-Pakete. Das ist voellig legal, und manchmal ist sowas auch die einzige Moeglichkeit, ein Programm in einer etwas anderen Version als auf dem System vorhanden zu nutzen.
Es wäre wohl am besten, wenn ich die Variabel paths aus deinem Beispiel so benutze, oder?
paths = os.getenv('PATH').split(':')
Somit dürgen Änderungen am Code nicht nötig sein, da es ja, wie es richtig sein sollte, über ${PATH} gesteuert wird, aus welchen Verzeichnissen ein User etwas ausführen darf.
Das ist sicher eine gute Loesung - und ebenfalls eine Liste..... Das Argument bleibt also gueltig. MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Sam, den 04.09.2004 um 14:36 Uhr +0200 schrieb Diez B. Roggisch: [...]
Es wäre wohl am besten, wenn ich die Variabel paths aus deinem Beispiel so benutze, oder?
paths = os.getenv('PATH').split(':')
Somit dürgen Änderungen am Code nicht nötig sein, da es ja, wie es richtig sein sollte, über ${PATH} gesteuert wird, aus welchen Verzeichnissen ein User etwas ausführen darf.
Das ist sicher eine gute Loesung - und ebenfalls eine Liste..... Das Argument bleibt also gueltig.
Der Einsatz von Listen macht den Code wirklich um Einiges kürzer. Die ursprüngliche Datie war 7,8 und die neue nur 2,7 KB groß. Am Anfang des Skriptes lese ich $PATH mit getenv('PATH').split(':') ein. Die gesuchten WMs habe ich in eine Liste gepackt. Und ob die WMs auch existieren, bzw. aufrufbar sind, prüfe ich jetzt so und erzeuge auch gleich die RadioButtons. for wm in wms: rb = wm for path in paths: if access(path+'/'+wm, X_OK): if group: rb = gtk.RadioButton(label = wm, group = group) else: rb = gtk.RadioButton(label = wm) group = rb vbox1.pack_start(rb) rbs.append(rb) break Mein ursprüngliches Problem habe ich dann so gelöst. for rb in rbs: if rb.get_active() == True: wm = rb.get_label() system(wm) break Auch wenn ich ein bissl basteln musste, hab ich es hinbekommen. Würd also sagen, dass ich etwas gelernt habe. Hoffe ich! Nicht, dass ich hier auch wieder Klimmzüge gemacht habe. Zwar funktioniert das Skript noch nicht so, wie ich es mir wünsche. Aber das ist ein Problem mit PyGTK. Vielen Dank für deine Hilfe und deine Geduld mit mir. Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
for wm in wms: rb = wm for path in paths: if access(path+'/'+wm, X_OK): if group: rb = gtk.RadioButton(label = wm, group = group) else: rb = gtk.RadioButton(label = wm) group = rb vbox1.pack_start(rb) rbs.append(rb) break
Schon fast perfekt - statt path + '/' + wm solltest du aber os.path.join verwenden - das ist erstens Plattformunabhaengig (fuer dich vielleicht nicht se wichtig, aber guter Stil schadet nie) und ausserdem sollte das auch mit Sonderfaellen besser klarkommen, zB Pfaden mit / am Ende.
Mein ursprüngliches Problem habe ich dann so gelöst.
for rb in rbs: if rb.get_active() == True: wm = rb.get_label() system(wm) break
Hier bietet sich eher an, stattdessen eine Map von rb auf wm aufzubauen - denn das Label kann ja zb auch mal anders aussehen, zB "KDE" oder so. Dazu musst du nur wms = {} anlegen und nach der Zeile
vbox1.pack_start(rb)
wms[rb] = wm machen. Du kannst dann mit wms[rb] darauf zugreifen in deinem snippet oben. Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Son, den 05.09.2004 um 17:10 Uhr +0200 schrieb Diez B. Roggisch:
for wm in wms: rb = wm for path in paths: if access(path+'/'+wm, X_OK): if group: rb = gtk.RadioButton(label = wm, group = group) else: rb = gtk.RadioButton(label = wm) group = rb vbox1.pack_start(rb) rbs.append(rb) break
Schon fast perfekt - statt path + '/' + wm solltest du aber os.path.join verwenden - das ist erstens Plattformunabhaengig (fuer dich vielleicht nicht se wichtig, aber guter Stil schadet nie) und ausserdem sollte das auch mit Sonderfaellen besser klarkommen, zB Pfaden mit / am Ende.
Ich habe jetzt die Zeile "if access(path+'/'+wm, X_OK):" durch if "access(path.join(path, wm), X_OK):" ersetzt. Beim Aufruf des Skriptes erhalte ich diese Fehlermeldung: TypeError: join() takes exactly one argument (2 given) Laut meinem schlauen Büchlein ist der Aufruf von join richtig. Daher versteh ich den Fehler nicht so ganz.
Mein ursprüngliches Problem habe ich dann so gelöst.
for rb in rbs: if rb.get_active() == True: wm = rb.get_label() system(wm) break
Hier bietet sich eher an, stattdessen eine Map von rb auf wm aufzubauen - denn das Label kann ja zb auch mal anders aussehen, zB "KDE" oder so.
Das Label ist immer der Aufruf des WMs. Siehe ganz oben (label = wm). Eigentlich wollte ich entsprechend die Labels ändern. Zumindest für Xfce4, KDE und Gnome. Der Aufruf startxfce4, startkde und gnome-session als Label sieht nicht sehr schön aus. Aber als Lösung dafür ist mir auch nur dieses eingefallen. [ ... Testen ob WM existiert ... ] if wm == 'gnome-session': label = 'Gnome' elif wm == 'startkde': label = 'KDE' elif wm == 'startxfce4': label = 'XFce4' else: label = wm [ ... Aufbau der RadioButton ... ] Hier taucht aber ja wieder das Problem auf, wenn Gnome mal nicht über gnome-session aufgerufen wird, müsste das Skript auch wieder an mehreren Stellen angepasst werden.
Dazu musst du nur
wms = {}
anlegen und nach der Zeile
vbox1.pack_start(rb)
wms[rb] = wm
machen. Du kannst dann mit
wms[rb]
darauf zugreifen in deinem snippet oben.
Kannst du mir das genauer erklären? Ich habe nur in einem meiner Bücher was über map() gefunden. Aber weder das noch die Info von help(map) verstehe ich wirklich. Du hast in einer Mail ein Config-File angesprochen. Der Gedanke wäre vielleicht ganz gut um das eine oder andere Problem zu lösen. Zum Beispiel für mögliche WMs und das Label. Ich habe aber nirgendwo in meinen Büchern einen Hinweis gefunden, wie man das am Besten realisiert. Hast du da vielleicht auch einen Tipp für mich? Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Hallo,
Ich habe jetzt die Zeile "if access(path+'/'+wm, X_OK):" durch if "access(path.join(path, wm), X_OK):" ersetzt.
Beim Aufruf des Skriptes erhalte ich diese Fehlermeldung:
TypeError: join() takes exactly one argument (2 given)
Laut meinem schlauen Büchlein ist der Aufruf von join richtig. Daher versteh ich den Fehler nicht so ganz.
Ich auch nicht - ist das wirklich genau die Zeile? Und wenn ja, wie genau sehen dann path und wm aus?
Das Label ist immer der Aufruf des WMs. Siehe ganz oben (label = wm). Eigentlich wollte ich entsprechend die Labels ändern. Zumindest für Xfce4, KDE und Gnome. Der Aufruf startxfce4, startkde und gnome-session als Label sieht nicht sehr schön aus.
Aber als Lösung dafür ist mir auch nur dieses eingefallen.
[ ... Testen ob WM existiert ... ] if wm == 'gnome-session': label = 'Gnome' elif wm == 'startkde': label = 'KDE' elif wm == 'startxfce4': label = 'XFce4' else: label = wm [ ... Aufbau der RadioButton ... ]
Ne. Statdessen ein dict wie folgt: exe2name = {"gnome-session" : "Gnome", "startfce4" : "XFce4"} und so weiter. Dann so: label = exe2name(wm, wm) lies mal in der python-doku nach was get(..) auf dicts tut.
Kannst du mir das genauer erklären? Ich habe nur in einem meiner Bücher was über map() gefunden. Aber weder das noch die Info von help(map) verstehe ich wirklich.
Aeh, map und dict sind fuer mich synonym - das liegt daran, das in java dicts maps heissen. Und map() als Funktion hat damit nix zu tun. Ich haette da praeziser sein muessen, bin in der Terminologie verrutscht.
Zum Beispiel für mögliche WMs und das Label. Ich habe aber nirgendwo in meinen Büchern einen Hinweis gefunden, wie man das am Besten realisiert.
Hast du da vielleicht auch einen Tipp für mich?
Ich weiss ja nicht was du fuer mehr oder minder schlaue Bucher hast - aber lass dir gesagt sein, das google und die Python module-docs dein Freund sind. Da steht zB auch ConfigParser drin. Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Mon, den 06.09.2004 um 18:26 Uhr +0200 schrieb Diez B. Roggisch:
Das Label ist immer der Aufruf des WMs. Siehe ganz oben (label = wm). Eigentlich wollte ich entsprechend die Labels ändern. Zumindest für Xfce4, KDE und Gnome. Der Aufruf startxfce4, startkde und gnome-session als Label sieht nicht sehr schön aus.
Aber als Lösung dafür ist mir auch nur dieses eingefallen.
[ ... Testen ob WM existiert ... ] if wm == 'gnome-session': label = 'Gnome' elif wm == 'startkde': label = 'KDE' elif wm == 'startxfce4': label = 'XFce4' else: label = wm [ ... Aufbau der RadioButton ... ]
Ne. Statdessen ein dict wie folgt:
exe2name = {"gnome-session" : "Gnome", "startfce4" : "XFce4"}
und so weiter.
Dann so:
label = exe2name(wm, wm)
lies mal in der python-doku nach was get(..) auf dicts tut.
Habe das jetzt über eine Konfi mit ConfigParser gemacht. Hab zwar seit heut Nachmittag dran gesessen, bis ich es kapiert hab. Aber hab es jetzt einigermaßen hinbekommen.
Kannst du mir das genauer erklären? Ich habe nur in einem meiner Bücher was über map() gefunden. Aber weder das noch die Info von help(map) verstehe ich wirklich.
Aeh, map und dict sind fuer mich synonym - das liegt daran, das in java dicts maps heissen. Und map() als Funktion hat damit nix zu tun. Ich haette da praeziser sein muessen, bin in der Terminologie verrutscht.
Ach, so. Bin noch dabei mich mit dict auseinander zu setzen. So ein bissl hab ich noch Verständnisprobleme. Aber das wird auch noch.
Zum Beispiel für mögliche WMs und das Label. Ich habe aber nirgendwo in meinen Büchern einen Hinweis gefunden, wie man das am Besten realisiert.
Hast du da vielleicht auch einen Tipp für mich?
Ich weiss ja nicht was du fuer mehr oder minder schlaue Bucher hast - aber lass dir gesagt sein, das google und die Python module-docs dein Freund sind. Da steht zB auch ConfigParser drin.
Habe drei Bücher. Python ge-packt und Objektorientierte Programmierung mit Python, von Michael Weigand und Irgendwas mit GUI-Programmierung mit Python. In letzteres hab ich schon ewig nicht mehr reingeschaut, da mir das zu unverständlich geschrieben war. Mit Google hab ich nix gefunden. Bestimmt wieder mit den falschen Stichwörter gesucht. Und die Python-Hilfe bringt mich leider nicht immer weiter, da mein Englisch ziemlich schlecht ist. :-( Bevor ich jetzt noch mal die einzelnen Zeilen poste, hab ich das Skript mal als HTML online gestellt. http://de.geocities.com/bmh1980de/wmselector.py.html Und die Konfig-Datei. http://de.geocities.com/bmh1980de/wmselector.cfg.html Denke mal, dass ich wohl doch was von euch gelernt habe und das auch umgesetzt habe ohne um zehn Ecken zu gehen. Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Denke mal, dass ich wohl doch was von euch gelernt habe und das auch umgesetzt habe ohne um zehn Ecken zu gehen.
Sieht soweit ganz gut aus, mit Ausnahme der Methode startwm. Statt ueber die radiobuttons zu suchen, wuerde ich fuer jeden Button ein command registrieren, das ausgefuehrt wird wenn der Button geclickt wird und das dann ihn oder seinen wm global setzt. Damit entfaellt dann die Suche ueber alle Buttons (die bei komplizierteren widget-architekturen auch schwieriger wird) MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Am Don, den 09.09.2004 um 1:36 Uhr +0200 schrieb Diez B. Roggisch:
Denke mal, dass ich wohl doch was von euch gelernt habe und das auch umgesetzt habe ohne um zehn Ecken zu gehen.
Sieht soweit ganz gut aus, mit Ausnahme der Methode startwm. Statt ueber die radiobuttons zu suchen, wuerde ich fuer jeden Button ein command registrieren, das ausgefuehrt wird wenn der Button geclickt wird und das dann ihn oder seinen wm global setzt. Damit entfaellt dann die Suche ueber alle Buttons (die bei komplizierteren widget-architekturen auch schwieriger wird)
Habe mein Skript jetzt so abgeändert. # Globale Variabeln ... wms = {} # Widgets des Hauptfensters ... for section in configparser.sections(): for p in PATH: if os.access(os.path.join(p, configparser.get(section, 'Exec')), os.X_OK): label = configparser.get(section, 'Label') rb = label if group: rb = gtk.RadioButton(label = label, group = group) else: rb = gtk.RadioButton(label = label) group = rb vbox1.pack_start(rb) rbs.append(rb) wms[label] = configparser.get(section, 'Exec') break # Funktion des Okay-Buttons def startwm(*args): for rb in rbs: if rb.get_active() == True: window.hide() while gtk.events_pending(): gtk.main_iteration() os.system(wms [rb.get_label()]) window.show_all() break Und der Rest wie gehabt. Musste zwar ne Weile überlegen, bis ich auf die Lösung kam, aber ich bin drauf gekommen. *freu* ;-) Ich weiß zwar nicht, ob ich das in paar Wochen noch verstehe, aber das lässt sich ja mir zusätzlichen Kommentaren oder einer Art Howto lösen. Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/5238a3732fd7663851110f536394a5c6.jpg?s=120&d=mm&r=g)
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, Marcus Habermehl wrote: Nachdem es mit immer wieder "ausstößt": | if group: | rb = gtk.RadioButton(label = label, group = group) | else: | rb = gtk.RadioButton(label = label) | group = rb Besser: group = None ... ~ ... ~ rb = gtk.RadioButton(label = label, group = group) ~ if not group: ~ group = rb Nachdem laut der Doko, die Du mal gepostet hast, der Default für den Parameter group None ist, kannst Du auch gleich None übergeben und den Spezialfall "erster Button" kürzer abhandeln. - -- Schönen Gruß - Regards Hartmut Goebel | Hartmut Goebel | IT-Security -- effizient | | h.goebel@goebel-consult.de | www.goebel-consult.de | -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBQGj683WjhA1moMgRAoFPAJ0f4I9inO/3CaUZ4l8fkSWllcWWcACgyEgv 7/Swl/9O5xGfiJN6g3yZWhU= =u6hb -----END PGP SIGNATURE----- _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Hallo. Am Don, den 09.09.2004 um 16:30 Uhr +0200 schrieb Hartmut Goebel:
Marcus Habermehl wrote:
Nachdem es mit immer wieder "ausstößt":
| if group: | rb = gtk.RadioButton(label = label, group = group) | else: | rb = gtk.RadioButton(label = label) | group = rb
Besser: group = None ... ~ ... ~ rb = gtk.RadioButton(label = label, group = group) ~ if not group: ~ group = rb
Nachdem laut der Doko, die Du mal gepostet hast, der Default für den Parameter group None ist, kannst Du auch gleich None übergeben und den Spezialfall "erster Button" kürzer abhandeln.
Stimmt, danke. Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/d51285667ea21bc8fbef83b74c8ff6ca.jpg?s=120&d=mm&r=g)
Hi,
Ich habe jetzt die Zeile "if access(path+'/'+wm, X_OK):" durch if "access(path.join(path, wm), X_OK):" ersetzt.
Weil path hier deinen String referenziert und nicht das Modul os.path. Ersetze mal path.join durch os.path.join (vorher natürlich os importieren)... Bye Oliver _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/84010db55dbfb2c2ea446a9914c979e5.jpg?s=120&d=mm&r=g)
Am Mon, den 06.09.2004 um 18:27 Uhr +0200 schrieb Oliver Horn:
Ich habe jetzt die Zeile "if access(path+'/'+wm, X_OK):" durch if "access(path.join(path, wm), X_OK):" ersetzt.
Weil path hier deinen String referenziert und nicht das Modul os.path. Ersetze mal path.join durch os.path.join (vorher natürlich os importieren)...
Genau der Grund, warum ich zu viele Variabeln hasse. ;-) Habe den String path jetzt einfach durch p ersetzt. Wenn ich os.path.join verwenden will, müsste ich doch path mit import os importieren, oder? Da fällt mir eine Frage ein, dich ich schon länger auf dem Herzen habe. Den Unterschied zwischen import ... und from ... import [*, ...] habe ich verstanden. Wenn ich aber jetzt zum Beispiel nur path aus os bräuchte, würde es nicht das Skript verlangsamen oder die Resourcen belasten, wenn ich gleich import os nehmen würde? Gruß Marcus _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Wenn ich aber jetzt zum Beispiel nur path aus os bräuchte, würde es nicht das Skript verlangsamen oder die Resourcen belasten, wenn ich gleich import os nehmen würde?
Nein - wenn ein Modul geladen wird, dann werden auch alle seine parents geladen. Also in deinem Fall os. Die verschiedenen Varianten von imports aendern nur die namens-bindung - also ob du from os import path from os.path import * import os.path import os.path as foo machst ist egal was resourcen und Zeit angeht. Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/48ef90b5c7ec4c8a32fb9fb78856f53d.jpg?s=120&d=mm&r=g)
Marcus Habermehl <bmh1980de@yahoo.de> writes:
Am Son, den 05.09.2004 um 17:10 Uhr +0200 schrieb Diez B. Roggisch:
for wm in wms: rb = wm for path in paths: if access(path+'/'+wm, X_OK): [...] Ich habe jetzt die Zeile "if access(path+'/'+wm, X_OK):" durch if "access(path.join(path, wm), X_OK):" ersetzt.
Beim Aufruf des Skriptes erhalte ich diese Fehlermeldung:
TypeError: join() takes exactly one argument (2 given)
path ist bei dir ja auch nicht das os.path Modul sondern ein String :) Bernhard -- Intevation GmbH http://intevation.de/ Skencil http://sketch.sourceforge.net/ Thuban http://thuban.intevation.org/ _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/5238a3732fd7663851110f536394a5c6.jpg?s=120&d=mm&r=g)
Hi, Marcus Habermehl wrote:
"access(path.join(path, wm), X_OK):" ersetzt.
Beim Aufruf des Skriptes erhalte ich diese Fehlermeldung:
TypeError: join() takes exactly one argument (2 given)
Du möchtest os.path.join() verwenden. Oben verwendest Du path.join(), also die Methode join() des Objekts Path (= Instanz von str), und die nimmt in der Tat nur ein Argument.
Hier bietet sich eher an, stattdessen eine Map von rb auf wm aufzubauen - denn das Label kann ja zb auch mal anders aussehen, zB "KDE" oder so.
Das Label ist immer der Aufruf des WMs. Siehe ganz oben (label = wm). Eigentlich wollte ich entsprechend die Labels ändern. Zumindest für Xfce4, KDE und Gnome. Der Aufruf startxfce4, startkde und gnome-session als Label sieht nicht sehr schön aus.
Aber als Lösung dafür ist mir auch nur dieses eingefallen.
[ ... Testen ob WM existiert ... ] if wm == 'gnome-session': label = 'Gnome' elif wm == 'startkde': label = 'KDE' elif wm == 'startxfce4': label = 'XFce4' else: label = wm [ ... Aufbau der RadioButton ... ]
Besser ein dict verwenden, wie Diez schon geschrieben hat.
Hier taucht aber ja wieder das Problem auf, wenn Gnome mal nicht über gnome-session aufgerufen wird, müsste das Skript auch wieder an mehreren Stellen angepasst werden.
Dann verwendest DU einweder das dict, oder Du schreibst eine kleine Funktion, di dann mehrmals aufgerufen wird.
Du hast in einer Mail ein Config-File angesprochen. Der Gedanke wäre vielleicht ganz gut um das eine oder andere Problem zu lösen. ... Hast du da vielleicht auch einen Tipp für mich?
Schau Dir mal ConfigParser an. Nimmt Konfig-file im Fomat [WMS] startkde: KDE gnome-session: Gnome [My Nead Stuff] path = xas name = adfad ... -- Schönen Gruß - Regards Hartmut Goebel | Hartmut Goebel | IT-Security -- effizient | | h.goebel@goebel-consult.de | www.goebel-consult.de | _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
Vielleicht habe ich es ja gelesen, als ich angefangen habe mich mit Python zu beschäftigen. Mein Problem ist aber, dass ich derartige Sachen erst dann lerne, wenn ich sie auch wirklich benutze. Also nur lesen bringt nix. Und den Code stur abtippen hat mir auch nicht geholfen.
Also um ehrlich zu sein - ich denke du hast schon eine Menge Gelegenheiten gehabt, dicts und Listen zu verwenden - nur was man nicht kennt, das benutzt man nicht. Henne-Ei-Problem. Aber das musst du loesen - du musst eine Intuition dafuer entwickeln, wann was in welche Datenstruktur gehoert. Das ist letztlich das A&O des Programmierens, in jeder Sprache uebrigens.
9.1. How does one group radio buttons to allow only one concurrent button to be depressed? GtkRadioButton() has a group parameter that defaults to None. The first button in the group is the group parameter for the remaining buttons. So you would do something like:
w = gtk.GtkWindow() v = gtk.GtkVBox() b1 = gtk.GtkRadioButton(label="Cows") b2 = gtk.GtkRadioButton(label="Dogs", group=b1) b3 = gtk.GtkRadioButton(label="Mountains", group=b1) v.add(b1) v.add(b2) v.add(b3) w.add(v) w.show_all()
[/Ausschnitt PyGTK FAQ]
Ok, dann brauchst du also genau eine Gruppe. Die kannst du nat. in group ablegen und dann immer verwenden.
Wenn ich das aus der Python-Hilfe richtig verstehe, ist der Inhalt von dict() bei deinem Beispiel alles, was in [] geschrieben ist. Oder liege ich da falsch?
Ein dict ist ein assoziativer Speicher - ein Schluessel wird auf einen Wert abgebildet. ZB so:
d = {} d['name'] = "Markus" d['nachname'] = "Habermehl" d {'name' : 'Markus', 'nachname' : 'Habermehl'}
Ich empfehle dir mal einfach den python interpreter zu starten und dann mit dicts rumzuspielen. Fuer die Werte eines dicts gibts eigentlich keine Einschraenkungen, fuer die Schluessel einige wenige, um die du dich im Moment nicht kuemmern musst - normalerweise geht da so gut wie alles. Du kannst ein dict wie oben auch mit der Funktion dict konstruieren, und zwar so: d = dict([('nachnahme', 'Habermehl'), ('name', 'Markus')]) Das heisst eine Liste von tupeln aus (key, value) Wie gesagt: beschaeftige dich damit - das ist sehr wichtig. Und das du das brauchst, hast du ja an dem gtk-code von mir gesehen.... Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
Bernhard Herzog
-
Diez B. Roggisch
-
Hartmut Goebel
-
Marcus Habermehl
-
Oliver Horn