Button Hintergrundfarbe

Fragen zu Tkinter.
LIFE-CUBES
User
Beiträge: 14
Registriert: Freitag 17. Februar 2012, 17:38

Dankeschön fur die zahlreichen Antworten! Haben mich ganz schön weitergebracht!
Aber eine Frage hätt ich da noch:
Kann man aus einer Funktion heraus bei Buttondruck und aufrufen einer Unterfunktion die Übergeordnete schließen und wieder ausführen? Wie ein refresh??

Danke Euch allen!

MfG
problembär

deets hat geschrieben:Du fuehrst im Namen leichterer Verstaendlichkeit unbekannte, missverstaendliche und sogar ausgewiesen falsche Begriffe ein.
Falsch. Ich habe durchgängig ausschließlich die Begriffe "Variable" und "Funktion" verwendet, Begriffe die der OP bereits kennt. Ich habe es gerade vermieden, neue Begriffe einzuführen.
deets hat geschrieben:Und das soll dem OP das Verstaendnis eines so komplexen Gegenstandes wie der OOP *vereinfachen*?
Allerdings. Wenn man OOP so auf lediglich einen Container reduziert, wie ich es getan habe, verliert das Thema seine Komplexität und man kann die einfachsten Grundlagen in einem Posting erklären, s.o..
deets hat geschrieben:Masst du dir wirklich an zu glauben, deine Einlassung hier ist ausreichend, um das OO-Programmieren zu erlernen?
Nein, dazu der weiterführende Link auf "A Byte of Python". Mir ging es nur um die allerersten Schritte, "Quickstart" sozusagen. Um einen Tkinter-Button zum Funktionieren zu bringen, könnten diese Schritte allerdings möglicherweise reichen.
deets hat geschrieben:Die Lernleistung ist also einfach nochmal zu erbringen.
Sicher, wenn man OOP wirklich verstehen will, reicht es nicht. Es ging nur um ein erstes Beispiel.
deets hat geschrieben:Und damit stellt sich mal wieder die Frage, wieso du so beharrlich darauf bestehst, Anfaengern solche Baerendienste zu erweisen.
Es macht mir halt Spaß, anderen Hilfestellungen zu geben. Wenn Du deren Qualität nicht zu schätzen weißt, ist das Dein Problem; nicht meins und nicht das der Hilfesuchenden.
Du hast allerdings das Recht, mich darauf hinzuweisen, wenn ich sachliche Fehler machen sollte. Ich werde mich dann bemühen, diese in den folgenden Postings zu verbessern.
So funktionieren Foren und Diskussionen in einer freien Gesellschaft nunmal: Jeder darf sagen, was er denkt. Selbst, wenn es falsch sein sollte. Und andere dürfen sich eine Meinung dazu bilden, was sie davon halten. Das nennt man Meinungsäußerungsfreiheit. Dieses Prinzip scheint Dir fremd zu sein, das mußt Du noch lernen, unbedingt.
LIFE-CUBES hat geschrieben:Kann man aus einer Funktion heraus bei Buttondruck und aufrufen einer Unterfunktion die Übergeordnete schließen und wieder ausführen? Wie ein refresh??
GUI-Anwendungen laufen anders ab als (fensterlose) Konsolenanwendungen. Wenn "rootwindow.mainloop()" aufgerufen wird, bleibt das Programm dort sozusagen "hängen" und wartet auf Benutzereingaben wie das Klicken eines Buttons. Erfolgt der Klick, wird die mit dem Button assoziierte Funktion aufgerufen. Danach kehrt das Programm in den Mainloop zurück.
Man braucht also keine Unterfunktionen oder so, um übergeordnete Funktionen zu beenden. Der Programmfluß ist immer so, wie gerade dargestellt: Mainloop -> Benutzereingabe -> Assoziierte Funktion -> Mainloop.
Bis das Root-Window (in einer der assoziierten Funktionen) mit "rootwindow.destroy()" geschlossen wird und die Anwendung beendet wird.
Zuletzt geändert von problembär am Samstag 18. Februar 2012, 23:20, insgesamt 3-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi LIFE-CUBES

Hier noch etwas zum experimentieren:

Code: Alles auswählen

import Tkinter as tk

COLOR_LIST = ['yellow', 'green', 'blue', 'red']

class ColorListBox(tk.Toplevel):
    
    def __init__(self, button):
        
        tk.Toplevel.__init__(self, button)
        
        self.button = button
        
        self.list_box = tk.Listbox(self, bd=0, highlightthickness=0,
            font=('Helvetica', 14))
        self.list_box.insert(0, *COLOR_LIST)
        self.list_box.pack()
        self.list_box.bind('<ButtonRelease-1>', self.selected_color)
    
    def selected_color(self, event):

        index = self.list_box.curselection()[0]
        color_name = self.list_box.get(index)
        self.button.config(bg=color_name)
        self.destroy()

def button_callback():
    ColorListBox(button)
    
main = tk.Tk()

button = tk.Button(main, text='BgChange', command=button_callback)
button.pack()

main.mainloop()
Gruß wuf :wink:
Take it easy Mates!
deets

problembär hat geschrieben:
deets hat geschrieben:Und damit stellt sich mal wieder die Frage, wieso du so beharrlich darauf bestehst, Anfaengern solche Baerendienste zu erweisen.
Es macht mir halt Spaß, anderen Hilfestellungen zu geben. Wenn Du deren Qualität nicht zu schätzen weißt, ist das Dein Problem; nicht meins und nicht das der Hilfesuchenden.
Du hast allerdings das Recht, mich darauf hinzuweisen, wenn ich sachliche Fehler machen sollte. Ich werde mich dann bemühen, diese in den folgenden Postings zu verbessern.
So funktionieren Foren und Diskussionen in einer freien Gesellschaft nunmal: Jeder darf sagen, was er denkt. Selbst, wenn es falsch sein sollte. Und andere dürfen sich eine Meinung dazu bilden, was sie davon halten. Das nennt man Meinungsäußerungsfreiheit. Dieses Prinzip scheint Dir fremd zu sein, das mußt Du noch lernen, unbedingt.
Was fuer ein Unfug. Niemand verbietet dir hier, deine Einlassungen vorzunehmen. Die Diskussion ueber Meinungsfreiheit ist also voellig fehl am Platz, und ich habe da auch keinen Lernbedarf.

Wo du aber irrst - und zwar gewaltig - ist, dass es kein Problem ist, wenn du mit deinen "Hilfestellungen" Schaden anrichtest. Und einzig und alleine darum geht es hier, wenn ich und andere dich deine kruden Ansichten korrigieren. Natuerlich waere es schoen zu sehen, wenn du selbst irgendwann auf den Trichter kommst, dass du daraus lernst. Aber ich halte das fuer eher unwahrscheinlich.

Doch unbedarfter Anfaenger wegen, die dank deiner einen schlechten Start hinlegen wuerden sind der Grund, deine Ansichten hier nicht unkorrigiert zu lassen.
BlackJack

@problembär: Natürlich ist die Qualität Deiner Hilfestellungen ein Problem des Hilfesuchenden. Und ganz offensichtlich haben auch andere ein Problem damit.

Deine Argumentation zur Meinungsfreiheit ist lustig. Die scheint ja nur für Dich zu gelten. Denn wir dürfen uns anscheinend nur eine Meinung zur Qualität Deiner Beiträge *bilden*. Aber wehe wir *äussern* sie auch. Dann wirfst Du uns vor *wir* hätten Meinungsfreiheit nicht verstanden. :-D

Zumal das sowieso nicht so funktioniert, wie Du Dir das zusammenfantasierst. Selbst wenn es richtig sein sollte, darfst Du hier nur sagen was die Moderatoren Dir durchgehen lassen. Das Grundgesetz verbietet weder das entfernen von Beiträgen in diesem Forum noch einen kompletten hinauswurf eines Mitglieds. Das muss man nicht einmal begründen.

Im Vergleich zu anderen Foren ist die Moderation in diesem Forum aber sogar sehr entspannt. Was ich persönlich gut finde! Artikel werden hier nur *sehr* selten inhaltlich verändert, zeitliche Sperren werden gar nicht verhängt, und Rauswürfe passieren eigentlich nur bei offensichtlich kommerziellen Spammern, die sonst nichts zum Thema Python beitragen.
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( )
Antworten