Seite 1 von 2

Programm soll auf den Button-klick warten!

Verfasst: Samstag 1. April 2006, 17:29
von oscar15
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

Verfasst: Samstag 1. April 2006, 18:25
von knekke
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....

Verfasst: Samstag 1. April 2006, 18:59
von oscar15
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)

Verfasst: Samstag 1. April 2006, 23:24
von knekke
was soll ich für machWas einsetztem?
... die Funktion die du ausführen willst, also text.[/quote]

Verfasst: Sonntag 2. April 2006, 00:08
von oscar15
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?

Verfasst: Sonntag 2. April 2006, 00:45
von knekke
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'.

Verfasst: Sonntag 2. April 2006, 01:30
von oscar15
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

Verfasst: Sonntag 2. April 2006, 10:28
von Mad-Marty
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

Verfasst: Sonntag 2. April 2006, 11:19
von oscar15
ich werde es dann mal heuer mittag reinstellen!

Verfasst: Sonntag 2. April 2006, 14:14
von oscar15
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)

Verfasst: Sonntag 2. April 2006, 22:12
von Bernhard
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

Verfasst: Montag 3. April 2006, 13:09
von knekke
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....

Verfasst: Montag 3. April 2006, 13:59
von oscar15
das problem ist, dass ich für den rest des programmes eine while brauche!!

Verfasst: Montag 3. April 2006, 14:17
von knekke
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.....

Verfasst: Montag 3. April 2006, 14:34
von oscar15
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!

Verfasst: Montag 3. April 2006, 14:41
von knekke
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

Verfasst: Montag 3. April 2006, 15:03
von oscar15
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!!!

Verfasst: Montag 3. April 2006, 15:19
von knekke
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.....

Verfasst: Montag 3. April 2006, 17:48
von oscar15
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....

Verfasst: Montag 3. April 2006, 18:23
von knekke
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....