Programm soll auf den Button-klick warten!

Fragen zu Tkinter.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

so ich habe mal wieder ein frage! mal? naja....

ich hab das Problem, dass ich eine graphische ausgábe mache und ich meine inputs durch buttons bekomme, doch mein Programm macht einfach weiter ohne auch nur auf einen Input zu warten!

gib es nicht einen Befehl, dass das Programm sollange warten soll, bis ein ein button geklickt wurde, weil ich kann auch während es in der Schleife festhängt nicht den Button betätigen!

danke schon mal
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Ich kann mich dunkel erinnern, dass ich so ein Problem auch mal mit TkInter hatte (wenn du das überhaupt benutzt). Ich habe dann lambda in dem Button-command benutzt. In etwa so:

Code: Alles auswählen

butt = Button(rot,text="text",width=5,command=lambda: machWas()).grid(row=0,column=0)
Ob das elegant ist oder überhaupt Not tut?? Keine Ahnung, aber es hat funktioniert....
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

1. bei mir muss ich cv statt rot eingeben
2.

Code: Alles auswählen

command=lambda: machWas()
was soll ich für machWas einsetztem?

normal hab ich es so:

Code: Alles auswählen

def text():
   blabla

bbutt = Button(cv, text="text", command=text)
wbutt = Window(cv, 900, 50, anchor="nw", window=bbutt)
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

was soll ich für machWas einsetztem?
... die Funktion die du ausführen willst, also text.[/quote]
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

also so wie ich es geschriben habe!

aber mein button sitzt in in einer while-schleife, die mir nicht die chance lässt, den button zu drücken, gibt es den dafü keinen befehl?
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Keine Ahnung, ob es dafür einen Befehl gibt. Aber als notlösung könntest du eine Variable 'isClicked' erzeugen, die am anfang der Schleife immer auf FALSE gesetzt wird. Und in die Funktion die der Button aufruft schreibst du 'isClicked = TRUE'.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

das problem ist ja, dass ich die schleife immer weiter un weiter geht und ich den buton nicht betätigen kann!
Sie wiederholt sich immer und immer wieder und ich bekomme net die chance den button zu betätigen!!^^

ich bin maa wech
n8

Flo
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

klingt nach nem schwer vermurksten aufbau wenn der button nicht klickbar ist.

Trenne den GUI idle loop von der ausführung, ansonsten wirst du immer probleme mit nicht reagierenden widgets haben.

Ohne das du hier jetzt echten code postest wird dir auch niemand helfen können - im besonderen das "while button" konstrukt
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

ich werde es dann mal heuer mittag reinstellen!
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Ich benutze die Buttons als input! Alles in einer while schleife:

Code: Alles auswählen

def textd():
    global a
    a = 4

hf = Tk()
cv = Canvas(hf, width=4000, height=2200)
cv.pack()

while Prüf1 > 0 or PrüfII > 0:
              
    bbutt = Button(cv, text="text", command=textd)
    wbutt = Window(cv, 900, 50, anchor="nw", window=bbutt)
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Sorry, bin nicht der Profi, aber Dein Code erscheint mir sehr komisch: Da wird in jedem Schleifendurchlauf ein Button und ein Window konstruiert aber nicht ge-pack()-t. Würde der Button ge-pack()-t, dann würde eine Variable a auf 4 gesetzt aber an den Prüfvariablen der Schleife wird nichts verändert.

Kann es sein, dass Du einfach nur nach
app.mainloop() suchst?

Gruß,
Bernhard
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Mir erschliesst sich leider auch nicht so ganz was du eigentlich vohast und wofuer du die while-schleife brauchst. Evtl. kannst du hiermit was anfangen:

Code: Alles auswählen

#!/usr/bin/python
 
import Tkinter as tk
 
root = tk.Tk()
a = 1
 
def func():
    global a
    a += 1
    print a
    if a > 10:
        print "stop"
     
butt = tk.Button(root, text="Button", command=lambda: func()).pack()
root.mainloop()
Keine while-schleife drin, und das global ist auch etwas ungluecklich, aber vielleicht hilft's ja....
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

das problem ist, dass ich für den rest des programmes eine while brauche!!
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Dann erklaere doch mal bitte was du machen willst... aus dem code-schnipsel da oben werde ich nicht wirklich schlau. Bei Knopfdruck wird a = 4 und Pruef1 und 2 werden gar nicht weiter angegeben.....
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

es ist ein Schleife die solange durchläuft, bis sie erfüllt wurde! logisch oder?
In ihr findet das Programm statt, von anfang bis ende!

Ich probier aber uahc mal deines noch aus!
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

es ist ein Schleife die solange durchläuft, bis sie erfüllt wurde! logisch oder?
In ihr findet das Programm statt, von anfang bis ende!
jetzt weiss ich genau was du machen willst.....

warum pruefst du nicht bei jedem button-druck, ob das ereignis eingetreten ist? dann sparst du dir die while-schleife
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

also ich habe jetzt deine sache, di du angesprochen hast mal ausprobiert, also es klappt schon besser als meine oder auch nicht, naja:

1. Die Buttons werden bei jeder wdh zu den alten hinzugefügt
2. Wenn ich einen Button klicke bekomme ich folgende aussage:
  • Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\....\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
    File "C:\....\Programm.py", line 351, in <lambda>
    Butt = tk.Button(root, text="Button", command=lambda: text()).pack()
    TypeError: 'int' object is not callable
3. das Programm muss mehrmals ausgeführt werden!!!
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

1. Die Buttons werden bei jeder wdh zu den alten hinzugefügt
?? Du meinst bei jedem Knopfdruck wird a um 1 erhoeht?? Ist das gut oder schlecht?
File "C:\....\Programm.py", line 351, in <lambda>
Butt = tk.Button(root, text="Button", command=lambda: text()).pack()
TypeError: 'int' object is not callable[/list]
werde ich nicht wirklich schlau draus. koennte es sein, das du Tkinter nicht als tk importiert hast??
3. das Programm muss mehrmals ausgeführt werden!!!
wieso, weshalb, warum....

Das ist wie in einem quiz hier... ich habe immernoch keine ahnung was du willst.....
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Es sit so, dass ich zwar die Buttons sehe, aber bei jeder ausführung der Schleife kommen unten drunter nochmal die buttons, also bei ersten mal hab ich sagen wir mal 5 Buttons danach 10, dann 15.......

Auch hab ich das selbe Prob wie am anfang! Mein Programm wartet einfach nicht, bis ein button geklickt wurde, da ändert leider deine Schreibweise auch nicht dran! Es rennt einfach durch....
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Ich will dir ja gerne helfen, aber so spaerlich wie du deine informationen raushaust ist das echt nicht leicht. Soweit ich dich verstanden habe will deine schleife so lange input bis ein bestimmtes Ereignis eintritt!? Input erfolgt ueber einen Button? Willst du zaehlen wie oft der Button gedrueckt wurde, oder was soll das fuer input sein? Hat das Ereignis etwas mit dem input zu tun, oder kommt das woanders her (z.B. eine bestimmte Zeit ist abgelaufen).

Bislang wuerde ich es so machen, dass ich bei jedem Buttondruck eine funktion aufrufe, in der dann auch geprueft wird, ob dieses ominoese Ereignis bereits eingetreten ist... also ohne while schleife ... da ich aber keinen blassen schimmer habe was du vorhast weiss ich nicht ob dir das weiterhilft. Passiert denn in der schleife noch etwas anderes ausser den input abzufangen?? Auch bin ich bei weitem kein Python-experte, und es kann gut sein, dass es fuers warten auf einen Buttondruck eine einfache methode gibt, aber googlen oder die boardsuche muesstest du dann schon selber bemuehen....
Antworten