Button Hintergrundfarbe

Fragen zu Tkinter.
problembär

Ob das, was ich sage, für einen Anfänger brauchbar ist, kann dieser selbst prüfen: Typischerweise poste ich Code-Beispiele. Die auch getestet sind, was bei euren ja nicht selbstverständlich ist.
Wenn diese Beispiele laufen, und das tun sie, weiß der Anfänger, daß der Python-Interpreter keine Einwände gegen meinen Code hat und er sieht auch, daß dieser das gewünschte Ergebnis erzielt. Dann kann der Code so schlecht nicht sein.

Jetzt kommt's aber ganz dicke:

Michael Weigend, Python GE-PACKT, 2. Auflage, Kapitel 15.2, S. 296, online hier:
Klassenattribute - gelegentlich auch Klassenvariablen genannt - sind Merkmale, die alle Objekte einer Klasse besitzen.
Jetzt kann jeder sehen, daß eure Vorwürfe absurd und haltlos sind.
deets

problembär hat geschrieben:Ob das, was ich sage, für einen Anfänger brauchbar ist, kann dieser selbst prüfen: Typischerweise poste ich Code-Beispiele. Die auch getestet sind, was bei euren ja nicht selbstverständlich ist.
Wenn diese Beispiele laufen, und das tun sie, weiß der Anfänger, daß der Python-Interpreter keine Einwände gegen meinen Code hat und er sieht auch, daß dieser das gewünschte Ergebnis erzielt. Dann kann der Code so schlecht nicht sein.

Jetzt kommt's aber ganz dicke:

Michael Weigend, Python GE-PACKT, 2. Auflage, Kapitel 15.2, S. 296, online hier:
Klassenattribute - gelegentlich auch Klassenvariablen genannt - sind Merkmale, die alle Objekte einer Klasse besitzen.
Jetzt kann jeder sehen, daß eure Vorwürfe absurd und haltlos sind.
Du begreifst noch nicht mal selbst was du da liest, oder? Eine Klassenvariable wird von *ALLEN* Instanzen einer Klasse geteilt. Exakt so, wie mein Beispiel das vorfuehrt, und wie Herr Weigend das beschreibt.

Du hingegen hast den Begriff fuer Instanzvariablen benutzt. Also schlicht falsch.

Und deine alte "wenn's der Interpreter schluckt, dann ist es guter Code"-Argumentation hat noch nie gestimmt, und wird nie stimmen. Das aendert auch das bestaendige Wiederholen von diesem Unfug nicht.
lunar

@problembär: Oh, wir sehen vielmehr, dass Du nicht einmal verstanden hast, was deets kritisiert hat und was Weigend schreibt. Voller Stolz zeigst Du uns, dass man auch Klassenvariable sagen darf. Lustig, darum ging es nie. Es geht um das vorangestellte Wort Klasse, und mithin um den bedeutsamen Unterschied zwischen den Begriffen "Klassenattribut" und "Exemplarattribut", welche Du in Deinem Beitrag synonym verwendet hast, obwohl sie unterschiedliche Arten von Attributen bezeichnen. Was Dir aber offensichtlich nicht einmal bewusst ist...

Es überrascht dann auch nicht mehr, dass Du noch immer glaubst, Quelltext wäre gut, nur weil der Interpreter ihn akzeptiert. Ein Programm ist nicht automatisch gut oder auch nur richtig, weil es syntaktisch korrekt ist, ebenso wie ein Buch nicht automatisch gut und richtig ist, weil es grammatikalisch korrekt ist.
problembär

So, und an diesem Punkt können wir möglicherweise sehen, wie Meinungsfreiheit funktioniert:

Also, ich wollte die Variablen in einer Klasse bezeichnen, also "self.classvalue" hier:

Code: Alles auswählen

class MyClass(object):

    def __init__(self):
        self.classvalue = 1
Ich habe diese Variablen "Klassenvariablen" genannt.
deets behauptet, sie müßten "Klassenattribute" heißen.
Ich verstehe Weigend so, daß er sagt, man könne beides dazu sagen.
Kann man das nun (beide Begriffe dafür verwenden) oder nicht?

Den Begriff von lunar, "Exemplarattribut", habe ich nie verwendet. Um echte Klassenvariablen wie in dem Beispiel von deets geht es auch nicht. Nur um die Klassenattribute und ob man sie auch möglicherweise untechnisch "Klassenvariablen" nennen kann.

Darüber kann man reden. Und dann kann man auch was davon lernen.

Aber, was man nicht sagen kann ist "Du hast keine Ahnung, hau' ab, schreib' hier nicht mehr, für Anfänger." Das habt ihr aber gemacht. Und das geht nicht.
Zuletzt geändert von problembär am Sonntag 19. Februar 2012, 13:08, insgesamt 1-mal geändert.
deets

problembär hat geschrieben:So, und an diesem Punkt können wir möglicherweise sehen, wie Meinungsfreiheit funktioniert:

Also, ich wollte die Variablen in einer Klasse bezeichnen, also "self.classvalue" hier:

Code: Alles auswählen

class MyClass(object):

    def __init__(self):
        self.classvalue = 1
Ich habe diese Variablen "Klassenvariablen" genannt. deets meint, die müßten "Klassenattribute" heißen.
Ich verstehe Weigend so, daß er sagt, man könne beides dazu sagen.


Kann man das nun (beide Begriffe dafür verwenden) oder nicht?
Du begreifst es nicht. Das ist weder eine Klassenvariable, noch ein Klassenattribut. SONDERN EINE INSTANZVARIABLE ODER INSTANZATTRIBUT.

Jetzt begriffen? Und das ist auch keine Frage der "Meinungsfreiheit". Rot ist rot, nicht gruen.

problembär hat geschrieben:
Darüber kann man reden. Und dann kann man auch was davon lernen.

Aber, was man nicht sagen kann ist "Du hast keine Ahnung, hau' ab, schreib' hier nicht mehr, für Anfänger." Das habt ihr aber gemacht. Und das geht nicht.
Das ist meine MEINUNG, (und die von anderen hier, aber die sollen fuer sich selbst sprechen), und wie du ja so schoen dargelegt hast: Meine MEINUNG zu dir und deinen Programmierkuensten zu verkuenden ist mein gutes Recht - MEINUNGSFREIHEIT. Ist keine Einbahnstrasse, lieber problembaer.

Und wie du gerade in diesem Thread eindrucksvoll unter Beweis stellst, sind dir selbst die Grundlagen nicht bekannt, die du dann aber anderen vermitteln moechtest?!? Und dabei soll dann was gutes rauskommen? Du bist wohl auch der Meinung, das Lehramt gehoere abgeschafft, und Unterricht sollte vom naechst besten Passanten auf der Strasse gegeben werden?

Merkbefreit sein muss schoen sein...
problembär

deets hat geschrieben:Du bist wohl auch der Meinung, das Lehramt gehoere abgeschafft, und Unterricht sollte vom naechst besten Passanten auf der Strasse gegeben werden?
Ja genau, das ist das Wesen eines freien Internetforums oder etwa auch von Wikipedia.
Jeder darf da schreiben, auch wer nicht ausgebildet ist.
Wenn es falsch ist, was geschrieben wird, kommen die möglicherweise besser ausgebildeten und korrigieren es. Am Ende hat man dann ein gutes Ergebnis.
Nur blöd, wenn alle die Leute, die was schreiben wollen, gleich mit "du begreifst es nicht" beschimpft werden. Dann wird natürlich jedes Engagement erstickt.
Zuletzt geändert von problembär am Sonntag 19. Februar 2012, 13:14, insgesamt 1-mal geändert.
deets

Schoen, wie du die Korrektur an deinem falschen Verstaendnis einfach mal so unter den Tisch fallen laesst...

Und was sind wir denn hier, wenn nicht besser ausgebildete Programmierer als du, die dich bestaendig korrigieren? Aber weder Wikipedia noch dieses Forum hier funktioniert dadurch, das jemand erstmal Quark erzaehlt, und andere muessen's dann ausloeffeln. Und du bist nunmal ein grosser Quarkproduzent.
problembär

deets hat geschrieben:Und du bist nunmal ein grosser Quarkproduzent.
Erstmal bestreite ich das. Und zum anderen wäre das, wenn es wahr wäre, wie gesagt für das Prinzip des Forums, richtig angewandt, nicht von Bedeutung.

Nur durch Beschimpfungen unterminiert ihr dieses Prinzip. Und dann funktioniert das Forum insgesamt auch nicht mehr.
Gleiches gilt für OpenSource: Jeder darf da erstmal Quark in den Code schreiben. Nach eurer Auffassung könnte es weder OpenSource noch Linux überhaupt geben. Und also auch nicht Python.
Zuletzt geändert von problembär am Sonntag 19. Februar 2012, 13:19, insgesamt 2-mal geändert.
deets

Du und jeder ander hat den schriftlichen Beweis dafuer, dass du Quark produzierst hier in diesem Thread vorliegen. Du hast IMMER NOCH NICHT verstanden, was der Unterschied zwischen einer Instanz- und einer Klassenvariable ist, masst dir aber an, anderen wertvolle Tipps genau dazu geben zu koennen.

Und zum wiederholten Male: Nein, so funktioniert auch dieses Forum hier nicht. Wenn es den Moderatoren zu bunt wird mit deiner "Hilfe", dann koennen und duerfen sie dich mundtot machen. Es ist IHR Forum. Ich will das persoenlich gar nicht so umgesetzt sehen - aber hier irrst du genauso, wie bei so ziemlich allem anderen auch.
problembär

deets hat geschrieben:aber hier irrst du genauso, wie bei so ziemlich allem anderen auch.
Wird bestritten. Und nun? Kinderkram.

Und mal wieder: Klassenvariablen oder was auch immer, sind dem OP total egal und für das, was er machen will, ohne Bedeutung. Dauernd verzettelt ihr euch in Nebensächlichkeiten.

Und das ist dann auch noch ganz toll:
lunar hat geschrieben:Es überrascht dann auch nicht mehr, dass Du noch immer glaubst, Quelltext wäre gut, nur weil der Interpreter ihn akzeptiert.
... "und weil es läuft und das gewünschte Ergebnis liefert", muß man noch ergänzen: Damit entzieht ihr so nebenbei die einzige objektive Möglichkeit zu überprüfen, was richtiger Code ist.
Und ihr eröffnet euch damit eine schöne Möglichkeit, auch Leute anzumachen, selbst wenn sie stets lauffähigen Code schreiben.
Wieso sollte lauffähiger Python-Code Quark sein und wieso der, der ihn schreibt, Quarkproduzent?
Dafür maßt ihr euch die Deutungshoheit an. Die habt ihr aber nicht.
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!
Antworten