Button Hintergrundfarbe

Fragen zu Tkinter.
BlackJack

@problembär: Versuch mal wie weit Du bei Wikipedia kommst, in dem Du Artikel anlegst nach der Devise „hauptsache er ist erst einmal da, inhaltliche Korrektheit kommt dann schon”. Da fliegst Du recht schnell raus. Bei Wikipedia kannst Du das immerhin versuchen, bei OpenSource kommst Du dagegen noch nicht einmal so weit. Versuch mal Quark in den Linux-Quelltext zu schreiben. Das kannst Du in Deinem privaten Kämmerlein tun, aber in offizielle Repositories wirst Du das nicht bekommen. Da findet nämlich im Gegensatz zum Forum oder bei Wikipedia in aller Regel eine Zugangskontrolle statt, die sicherstellt, dass eine gewisse Qualifikation vorhanden ist. Nicht nur das — man sollte auch den jeweiligen Style-Guides der Projekte folgen. Denn auch das sind in der Regel KO-Kriterien, selbst wenn eine Programmänderung syntaktisch korrekt ist *und* auch das tut was sie soll.

Du bestreitest das jeder Moderator die technischen Möglichkeiten hätte a) Deine Beiträge zu ändern oder zu löschen oder b) sogar Dein komplettes Benutzerkonto zu löschen? Oder bezweifelst Du dass die Moderation insgesamt so etwas in besonders ausufernden Fällen auch befürworten würde? Oder geht es Dir darum dass Du glaubst dann ein Gerichtsverfahren auf Grundlage von GG §5 führen zu können?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembaer hat geschrieben:Wieso sollte lauffähiger Python-Code Quark sein und wieso der, der ihn schreibt, Quarkproduzent
Da gibt es viele Gründe dafür.

Als erstes muss ein Algorithmus robust sein, d.h. auch in Grenzfällen funktionieren oder sinnvolle Fehlerrückmeldungen geben.

Als nächstes spielt da die Komplexität eines Algorithmus eine zentrale Rolle. Unter der Bedingung, dass zwei Algorithmen korrekt funktionieren und das gegebene Problem lösen, so wählt man idR. denjenigen, der das bessere Laufzeitverhalten hat.

Als letztes fällt mir spontan dann noch die Verletzung von Sprach typischen Idiomen ein. Oftmals hängt das auch mit den ersten Punkten zusammen, aber es kann davon unabhängig auch ein Kriterium sein, welches einen Code-Schnipsel als "schlecht" definierbar macht.

Ich denke das Hauptproblem mit Deinen Hilfestellungen ist, dass Du selber nicht lernwillig bist oder Dich zumindest hier so präsentierst. Du stellst hier Kritik immer als Anfeindung dar, in Wirklichkeit kommt es zu "genervten" Äußerungen von Forenmitgliedern eher dadurch, dass Du zum x-ten Mal denselben schlechten Code postest, obwohl Du darauf schon x-Mal hingewiesen wurdest. Anstelle das einmal anzunehmen, das zu durchdenken und schließlich selber korrekt anzuwenden, versteifst Du Dich auf Sturheit und redest Dich mit Schlagworten wie "Meinungsfreiheut" heraus. Ich denke, wenn Du hier mal sichtbar Lernbereitschaft zeigtest - wie etwa auf deets Klarstellung zum Thema Klassen- vs. Instanzattribut einzugehen - dann würden die Postings an Dich auch an Schärfe verlieren und schließlich ein entspanntes Verhältnis wieder Einzug halten :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

Okok! Ganz ruhig! Wollt ja nicht gleich dass ihr zu streiten beginnt!

Hab noch eine Frage: Kann man durch einen Button unter 'command' die Funktion schließen [main.destroy()] und eine Unterfunktion GLEICHZEITIG aufrufen??

Mfg
deets

@LIFE-CUBES

Code: Alles auswählen

def meine_funktion():
      erste_funktion()
      zweite_funktion()
Fuer die Streitereien kannst du ja nix...
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

So hätt ich das auch schon ausprobiert, aber ich kann keine unterfunktion in einer unter-unterfunktion schließen!
Werd das mal kurz demonstrieren:

Code: Alles auswählen

from Tkinter import *
from sys import stdout, exit


def destroy():
    button.destroy()

def unterfunktion():
    button=Toplevel()
    button = Button(button, text='Schließen!', command=destroy)
    button.pack( )
    button.mainloop( )



widget = Button(None, text='Unterfunktion', command=unterfunktion )
widget.pack( )
widget.mainloop( )
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi LIFE-CUBES & Forumfreunde

Meinst du so etwas?:

Code: Alles auswählen

import Tkinter as tk

def killing_me_softly():
    do_still_something()
    app_win.destroy()

def do_still_something():
    print"Good Bye!"
    
app_win = tk.Tk()
app_win.protocol("WM_DELETE_WINDOW", killing_me_softly)

button = tk.Button(app_win, text='Beenden', command=lambda:killing_me_softly())
button.pack()

app_win.mainloop()
Gruß wuf :wink:

Uh das gab beinahe eine Kollision :lol:
Take it easy Mates!
deets

LIFE-CUBES hat geschrieben:So hätt ich das auch schon ausprobiert, aber ich kann keine unterfunktion in einer unter-unterfunktion schließen!
Ich weiss nicht, was das heissen soll - aber "kann nicht" sollte (wie auch schon bei anderen Posts von dir) mit einer konkreten Fehlermeldung daher kommen. Und in deinem Fall liegt das daran (denke ich, wissen kann man's ja nicht...), dass du "button" nicht global definiert hast.
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

Will eigentlich nur die Hintergrundfarbe des Buttons ändern. Klickt man in der Unterfunktion auf schließen und schließt die Unterfunktion dann manuell, dann hat sich die Hintergrundfarbe auf grün geändert...
Will das ganze nur automatisieren, aber seht selbst:


Code: Alles auswählen

from Tkinter import *
from sys import stdout, exit


global VARIABLE
VARIABLE='white'

def destroy():
    global VARIABLE
    VARIABLE='green' #Will noch eine Variable setzen
    button.destroy()
    #und die unterfunktion wieder ausführen ev. mit
    button.mainloop()

def unterfunktion():
    button=Toplevel()
    button = Button(button, text='Schließen!', command=destroy) #im button.config befindet sich eben die Variable
    button.config(bg=VARIABLE)
    button.pack( )
    button.mainloop( )
widget=Tk()
widget = Button(None, text='Unterfunktion', command=unterfunktion )
widget.pack( )
widget.mainloop( )
deets

seufz. nochmal, was fuer eine Fehlermeldung bekommst du?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi LIFE-CUBES

Dein Snippet enthält diverse Fehler!
LIFE-CUBES hat geschrieben:

Code: Alles auswählen

global VARIABLE
Braucht es nicht
LIFE-CUBES hat geschrieben:

Code: Alles auswählen

VARIABLE='white'
Gross geschriebenes ist für mich nicht eine Variable sondern eine Konstante. Und Konstanten ändert man normalerweise im Programmablauf nicht.
LIFE-CUBES hat geschrieben:

Code: Alles auswählen

    button=Toplevel()
    button = Button(button, text='Schließen!', command=destroy) #im button.config befindet sich eben die Variable
    button.config(bg=VARIABLE)
    button.pack( )
    button.mainloop( )
Hier überschreibst du die Toplevel-Instanz mit der Button-Instanz! Für die Toplevel- und Button-Instanz unterschiedliche Namen verwenden!
LIFE-CUBES hat geschrieben:

Code: Alles auswählen

widget=Tk()
widget = Button(None, text='Unterfunktion', command=unterfunktion )
widget.pack( )
widget.mainloop( )
Hier überschreibst du die widget(root)-Instanz mit der Button-Instant! Für die Tk- und Button-Instanz unterschiedliche Namen verwenden!

Code: Alles auswählen

xxx.mainloop( )
xxx.mainloop braucht es nur einmal und nicht dreimal! Hier zum beispiel nur widget.mainloop()

Würde dir auch empfehlen einmal die PEP-8 Story näher anzuschauen. Mein Haupsprache ist deutsch. Kannst du einmal versuchen deine Aufgabe in klarem interpretierbarem deutsch zu beschreiben. Es wäre schön von dir zu erfahren ob der von uns in diesem Forum platzierte Code(Snippets) bei dir auch funktionieren.

Gruß wuf :wink:
Take it easy Mates!
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

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
LIFE-CUBES
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( )
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi LIFE-CUBES
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( )
Dein letztes Post werde ich gleich noch anschauen.

Gruß wuf :wink:
Take it easy Mates!
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

Ich könnt dich küssen! Das ist es!!! :)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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.

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( )
Gruß wuf :wink:
Take it easy Mates!
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

Danke vielmals! Hast mir wirklich weiterhelfen können!
MfG
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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.

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()
Gruß wuf :wink:
Take it easy Mates!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kleiner, etwas später Hinweis, weil ich das grad sehe:

Code: Alles auswählen

Button(main, text='Unterfunktion', command=lambda:unterfunktion()).pack()
würde man besser als

Code: Alles auswählen

Button(main, text='Unterfunktion', command=unterfunktion).pack()
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Leonidas

Hast du richtig festgestellt. Danke für den Hinweis.
Leonidas hat geschrieben:Merkregel: wenn man ``lambda`` im Code stehen hat, gibt es meist eine bessere Möglichkeit das Problem zu lösen.
Meinst du damit etwa:

Code: Alles auswählen

from functools import partial
Gruß wuf :wink:
Take it easy Mates!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

wuf hat geschrieben:Meinst du damit etwa:

Code: Alles auswählen

from functools import partial
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten