Button command startet automatisch

Fragen zu Tkinter.
Antworten
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Hi. Ich bin neu hier und hab vor kurzem wieder angefangen zu programmieren. Ich bin nun allerdings bei Tkinter auf ein Problem gestoßen.

Meine Buttons siehen ungefähr wie folgt aus:

Code: Alles auswählen

bild=PhotoImage(file="pfad")
button=Button(root, image=bild, command=funktion(Liste, bild))
button.place(...)
Es soll also wenn ich auf den Button klicke eine Funktion aufgerufen werden, die zwei weitere Funktionen ausführt (die eine braucht die Liste, die andere das Bild). Allerdings wird die Funktion bereits ausgeführt bevor überhaupt das Fenster erscheint.

Könnt ihr mir sagen woran das liegt und wie ich den Fehler beheben kann?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Das liegt daran, dass du die Funktion aufrufst, bevor du überhaupt darauf klickst. Da ist keine magische Tkinter-Zwischenschicht zwischen, das ist ein Funktionsaufruf wie jeder andere! Du müsstest eine Funktion anlegen, die die andere Funktion aufruft und die als Argument übergeben:

Code: Alles auswählen

Button(command=lambda: funktion(Liste, bild))
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Danke. Wieder was dazu gelernt. Jetzt funktionierts auf jeden Fall erstmal. Falls irgendwann wieder eine Frage auftaucht frag ich einfach;)
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Hat ja nicht lange gedauert. Ich hab schon wieder eine neue Frage.

Ich hab zwei Python Dateien. Eine mit den Funktionen und eine mit der GUI. In der Datei mit den Funktionen hab ich eine Variable, die von einigen Funktionen genutzt und auch verändert wird. Diese Variable soll jetzt von einer Funktion in der GUI Datei genutzt werden. Allerdings bekommt die Funktion in der GUI Datei nicht den veränderten Wert sondern nur den Ausgangswert (=0).

Wie kann ich den veränderten Wert an die Funktion in der GUI Datei übergeben?

Die Dateien aus der Funktionsdatei hab ich wie folgt importiert:

Code: Alles auswählen

from Funktionsdatei import *
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Sternchenimporte sind böse.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

webspider hat geschrieben:Sternchenimporte sind böse.
Nö, die sind okay, solange man weiß, was man tut. Außerdem ist das gar nicht das größte Problem dabei, eher die globale Variable.

@berl1n: Erstens ist das was du jetzt hier tust Thread-Hijacking, zweitens lass das mit den globalen Variablen, verwende lieber eine Klasse oder so etwas. Da du ja keinen Code zeigen willst, kann man dir ja nicht richtig helfen. Unsere Glaskugel hat einen Sprung.
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Ok. Danke erstmal. Ich werd das dann mit Klassen erstmal probieren. Aber mich würde trotzdem interessieren ob man die Variable an die andere Datei übergeben kann oder ob das nicht geht.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Natürlich geht das, nur ist es schlechter Stil das zu tun.
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

webspider hat geschrieben:Natürlich geht das, nur ist es schlechter Stil das zu tun.
Könntest du mir vllt noch sagen wie das funktioniert? So wie ich es bis jetzt gemacht hab übergibt es ja nur den Startwert der Variablen.
BlackJack

@berl1n: Vielleicht solltest Du von dem Begriff „Variable” etwas weg kommen und mehr in Namen und Werten denken, die an Namen gebunden werden. Ein Sternchenimport schaut sich alle Namen aus dem Modul an, aus dem importiert wird und bindet diese Namen im importierenden Modul an die Werte aus dem importierten Modul. Wenn im importierten Modul ein Name danach an einen anderen Wert gebunden wird, hat das einzig Auswirkungen auf den Namen dort. An den Wert heran kommen möchtest, dann musst Du über *den* Namen gehen. Also das Attribut auf dem Modulobjekt.
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Danke. Ich habs jetzt verstanden und es funktioniert jetzt. Ich werd aber noch drüber nachdenken ob ichs nicht vllt trotzdem mit Klassen mache.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

webspider hat geschrieben:Natürlich geht das, nur ist es schlechter Stil das zu tun.
Na das sehe ich anders, ich hab in meinen Projekten gerne einen Sternchen-Import, spart einiges an Platz und Zeit.

Code: Alles auswählen

# A
__all__ = ["…", "…", "…"]

Code: Alles auswählen

# B
from A import *
the more they change the more they stay the same
BlackJack

@Dav1d: Es spart Platz? Ist der knapp? Und Zeit? Ist da auch die Zeit bei der Fehlersuche mit eingerechnet wo man erst einmal suchen muss woher bestimmte Namen kommen?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

:evil:
the more they change the more they stay the same
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Ich hab mal wieder ein kleines Problem mit Tkinter. Und zwar möchte ich mit Hilfe einer Funktion Labels erstellen. Die Labels unterscheiden sich immer abhängig von einer Variablen. Das klappt auch alles und die Labels werden erstellt. Allerdings habe ich eine zweite Funktion die wenn etwas bestimmtes der Fall ist das Label verändern soll (also Label.config(bd=...)). Das klappt allerdings nicht weil es sagt, dass das Label nicht existiert.

Die erste Funktion sieht etwa wie folgt aus:

Code: Alles auswählen

a=0

def funktion1(image):
    if a==0:
        Label1=Label(root, image=image)
        Label1.place(x=.., y=..)
        a+=1
    elif a==1:
        Label2=Label(root, image=image)
        Label2.place(x=.., y=..)
        a+=1
.
.
.
die zweite Funktion sieht dann wie folgt aus:

Code: Alles auswählen

b=0

def funktion2():
    if b==0:
        Label1.config(bd=...)
    elif b==1:
        Label2.config(bd=...)
.
.
.
Die Variable b wird von einer anderen Funktion verändert.

Könnt ihr mir sagen wie ich die Label so erstellen kann, dass ich sie mit anderen Funktionen verändern kann?

PS: Es tut mir leid das ich nicht den richtigen Code präsentieren kann (ich bin nicht an meinem Arbeits-PC) und das ich im Code nicht richtig einrücke (ich weiß nicht wie das hier funktioniert).
Zuletzt geändert von berl1n am Montag 23. Januar 2012, 20:06, insgesamt 1-mal geändert.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

  • Das hat nichts mehr mit dem ursprünglichen Thema zu tun, es sollte also ein neuer Thread dafür angelegt werden.
  • Einrücken funktioniert ganz einfach: Einfach einrücken (vier Leerzeichen)
Und jetzt bitte einrücken.
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Ok. Tut mir leid das ich das alles noch hier reingeschrieben habe. Ich bin es aus anderen Foren so gewohnt das man wenn man für alle Fragen einen eigenen Thread erstellt gleich dumm angemacht wird. Außerdem finde ich es auch selber besser so. Naja egal zurück zum Thema. Ich habs es im Post verändert, also eingerückt. Kannst du mir nun bei meinem Problem helfen?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Du solltest anfangen, deine Programme mit Klassen zu gestalten. Du würdest also eine Klasse anlegen, in der du die Labels etc. speicherst, und dann kann auch jede Methode die Labels verändern.

Code: Alles auswählen

from Tkinter import Frame, Tk, Button, Label

class App(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.label = Label(text='Beispiel')
        self.label.pack()
        self.button = Button(text='tu was', command=self.foo)
        self.button.pack()

    def foo(self):
        self.label.configure(text='ha!')

if __name__ == '__main__':
    root = Tk()
    a = App(root)
    root.mainloop()
berl1n
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:38

Ok. Danke. Dann werd ich das mal so probieren.
problembär

Da wirst Du noch einen Zwischenschritt brauchen: Du mußt wenigstens ungefähr in den Grundlagen verstehen, wie Klassen funktionieren (= OOP). Dazu z.B.

http://abop-german.berlios.de/read/classes.html

HTH
Antworten