1.: global brauch ich, sonst wird die (großgeschriebene) variable nicht gesetzt und ich kann sie in unterfunktionen nicht mehr benutzen
2.: ob groß oder klein --> egal!? weil ich sie ja definiere
3.:es hilft mir bei meinem eigentlichen problem nicht!
es gibt ja keine fehlermeldungen, probierts es doch mal aus! ich will einfach nur die config bei einem button ändern!
das kleine programm von oben funktioniert eigentlich, nur die automatisation fehlt mir!!!
mfg
Button Hintergrundfarbe
-
- User
- Beiträge: 14
- Registriert: Freitag 17. Februar 2012, 17:38
besser so?
Code: Alles auswählen
from Tkinter import *
from sys import stdout, exit
VARIABLE='white'
def destroy():
global VARIABLE
VARIABLE='green' #Will noch eine Variable setzen
frame.destroy()
#und die unterfunktion wieder ausführen ev. mit
def unterfunktion():
frame=Toplevel()
button = Button(frame, text='Schließen!', command=destroy) #im button.config befindet sich eben die Variable
button.config(bg=VARIABLE)
button.pack( )
main=Tk()
widget = Button(main, text='Unterfunktion', command=unterfunktion )
widget.pack( )
main.mainloop( )
Hi LIFE-CUBES
Habe dein vorheriges Skript einmal versucht abzuändern so wie ich die Funktion aus dem Skript interpretiere.
Dein letztes Post werde ich gleich noch anschauen.
Gruß wuf
Habe dein vorheriges Skript einmal versucht abzuändern so wie ich die Funktion aus dem Skript interpretiere.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import Tkinter as tk
def destroy():
app_win.variable = 'green'
app_win.toplevel_win.destroy()
def unterfunktion():
app_win.toplevel_win = tk.Toplevel()
tk.Button(app_win.toplevel_win, text='Schließen!', bg=app_win.variable,
command=destroy).pack( )
app_win = tk.Tk()
app_win.variable = 'white'
app_win.button_01 = tk.Button(app_win, text='Unterfunktion', command=unterfunktion )
app_win.button_01.pack()
app_win.mainloop( )
Gruß wuf

Take it easy Mates!
-
- User
- Beiträge: 14
- Registriert: Freitag 17. Februar 2012, 17:38
Ich könnt dich küssen! Das ist es!!! 

OK LIFE-CUBES
Dein letztes Skript ist schon bedeutend besser! Ich habe es noch so abgeändert, dass es keine Exceptions mehr wirft. Die Funktion 'destroy' konnte die Toplevel-Instanz 'frame' noch nicht sehen. Machte sie deshalb global. Global ist obwohl die Sprache Python sie in ihrem Wort-Vokabular hat verpöhnt. Aber für ein kleines Versuchsskript ist seine Anwendung keine Schande. Bei grösseren Programmen könnte es aber zu schwer auffindbaren Fehlern führen. Beim meinem Skript habe ich die global benötigten namen an die Instanz 'app_win' gebunden. Dies könnte aber auch zu Problemen führen da Attribute in der 'app_win'-Instanz, welche die gleiche Namen besitzen überschrieben werden könnten. Werde dein Skript noch näher anschauen um das Geisterwort 'global' zu eliminieren.
Gruß wuf 
Dein letztes Skript ist schon bedeutend besser! Ich habe es noch so abgeändert, dass es keine Exceptions mehr wirft. Die Funktion 'destroy' konnte die Toplevel-Instanz 'frame' noch nicht sehen. Machte sie deshalb global. Global ist obwohl die Sprache Python sie in ihrem Wort-Vokabular hat verpöhnt. Aber für ein kleines Versuchsskript ist seine Anwendung keine Schande. Bei grösseren Programmen könnte es aber zu schwer auffindbaren Fehlern führen. Beim meinem Skript habe ich die global benötigten namen an die Instanz 'app_win' gebunden. Dies könnte aber auch zu Problemen führen da Attribute in der 'app_win'-Instanz, welche die gleiche Namen besitzen überschrieben werden könnten. Werde dein Skript noch näher anschauen um das Geisterwort 'global' zu eliminieren.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from Tkinter import *
from sys import stdout, exit
VARIABLE='white'
def destroy():
global VARIABLE, frame
VARIABLE='green' #Will noch eine Variable setzen
frame.destroy()
#und die unterfunktion wieder ausführen ev. mit
def unterfunktion():
global frame
frame=Toplevel()
button = Button(frame, text='Schließen!', command=destroy) #im button.config befindet sich eben die Variable
button.config(bg=VARIABLE)
button.pack( )
main=Tk()
widget = Button(main, text='Unterfunktion', command=unterfunktion )
widget.pack( )
main.mainloop( )

Take it easy Mates!
-
- User
- Beiträge: 14
- Registriert: Freitag 17. Februar 2012, 17:38
Danke vielmals! Hast mir wirklich weiterhelfen können!
MfG
MfG
Hi LIFE-CUBES
Hier noch meine Variante das 'global' mit einer Hilfsklasse 'App' zu eliminieren. Man kann dann gobal verwendete Namen als Attribute an die Instanz 'app' der Klasse 'App' binden. Da haben eventuell unsere Forum-Kollegen noch bessere Lösungen.
Gruß wuf 
Hier noch meine Variante das 'global' mit einer Hilfsklasse 'App' zu eliminieren. Man kann dann gobal verwendete Namen als Attribute an die Instanz 'app' der Klasse 'App' binden. Da haben eventuell unsere Forum-Kollegen noch bessere Lösungen.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from Tkinter import *
from sys import stdout, exit
def destroy(frame):
app.variable='green'
frame.destroy()
def unterfunktion():
frame=Toplevel()
Button(frame, text='Schließen!', bg=app.variable,
command=lambda:destroy(frame)).pack()
class App(object):
def __init__(self):
pass
main=Tk()
app = App()
app.variable = 'white'
Button(main, text='Unterfunktion', command=lambda:unterfunktion()).pack()
main.mainloop()

Take it easy Mates!
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kleiner, etwas später Hinweis, weil ich das grad sehe:
würde man besser als
schreiben, denn es ist sinnlos einen Funktionsaufruf in eine Funktion zu packen. Merkregel: wenn man ``lambda`` im Code stehen hat, gibt es meist eine bessere Möglichkeit das Problem zu lösen.
Code: Alles auswählen
Button(main, text='Unterfunktion', command=lambda:unterfunktion()).pack()
Code: Alles auswählen
Button(main, text='Unterfunktion', command=unterfunktion).pack()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hi Leonidas
Hast du richtig festgestellt. Danke für den Hinweis.
Gruß wuf 
Hast du richtig festgestellt. Danke für den Hinweis.
Meinst du damit etwa:Leonidas hat geschrieben:Merkregel: wenn man ``lambda`` im Code stehen hat, gibt es meist eine bessere Möglichkeit das Problem zu lösen.
Code: Alles auswählen
from functools import partial

Take it easy Mates!
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Oft, ja. Manchmal aber auch ``operator.attrgetter`` (statt ``lambda foo: foo.baz``) und ``operator.itemgetter`` (statt ``lambda foo: foo[42]``). Ich persönlich find das klarer, aber da kann man sich streiten.wuf hat geschrieben:Meinst du damit etwa:Code: Alles auswählen
from functools import partial
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@Leonidas: Die Begriffe:Leonidas hat geschrieben:Oft, ja. Manchmal aber auch ``operator.attrgetter`` (statt ``lambda: foo['baz']``) und ``operator.itemgetter`` (statt ``lambda: foo[42]``)
Code: Alles auswählen
operator.attrgetter
Code: Alles auswählen
`operator.itemgetter
Code: Alles auswählen
Button(frame, text='Schließen!', bg=app.variable,
command=lambda:destroy(frame)).pack()
Code: Alles auswählen
Button(frame, text='Schließen!', bg=app.variable,
command=partial(destroy, frame)).pack()
Danke dir im Voraus.
Gruß wuf

Take it easy Mates!
@wuf: das loest man damit auch nicht. attrgetter und itemgetter erzeugen kleine Funktionen, die eben genau das machen, was ihre namen besagen: ein attribut oder item zurueckzulieferen, wenn man sie mit einem objekt aufruft. in etwa so:
analog auch attrgetter. damit ist man jetzt nicht unbedingt viel kompakter als mit lambdas. aber es ist ein bisschen wie mit map/filter/reduce oder list-comprehensions: die machen nicht viel mehr als eine normal schleife auch. aber wenn ich die sehe, weiss ich genau, was passiert - ich muss also nicht den ausdruck weiter zerlegen und verstehen, sondern kann ihn viel einfacher ueberlesen.
Code: Alles auswählen
def itemgetter(index):
def f(value):
return value[index]
return f
foo = itemgetter(0) # statt lambda d: d[0]
print foo({0 : "hallo"})