Programm soll auf den Button-klick warten!

Fragen zu Tkinter.
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Beitragvon knekke » Montag 3. April 2006, 14:41

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

Beitragvon oscar15 » Montag 3. April 2006, 15:03

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:
[list=]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[/list]

3. das Programm muss mehrmals ausgeführt werden!!!
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Beitragvon knekke » Montag 3. April 2006, 15:19

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

Beitragvon oscar15 » Montag 3. April 2006, 17:48

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

Beitragvon knekke » Montag 3. April 2006, 18:23

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....
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Montag 3. April 2006, 18:30

Ein bischen verwirrend der Thread bis jetzt.

@oscar15
Lass uns vielleicht nochmal neu starten, ich befürchte nämlich, dass wir alle hier aneinander vorbeidenken.
Magst du dafür beschreiben, wie dein Programm benutzt werden soll?
Ganz ohne Programmierhintergrund, nur das was der Anwender mit dem Programm tut und wie das dann reagiert.

zB:
Benutzer klickt auf den Knopf "Datei öffnen"
Benutzer sucht eine Datei aus
Programm zeigt Text im Anzeigebereich an
Benutzer markiert Text mit der Maus
Benutzer klickt auf den Knopf "fette Schrift"
Programm zeigt die markierte Stelle im Text in fetter Schrift an
...


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

Beitragvon oscar15 » Montag 3. April 2006, 19:32

die schleife muss solange laufen, bis etwas erfüllt wurde! damit das aber erfüllt werden kann müssen die buttons, als input, gedrückt werden!
Bei JEDEM durchlauf soll das gemacht werden, also er soll warten bis der input da ist!!!
silentbreaker
User
Beiträge: 7
Registriert: Montag 3. April 2006, 17:58

Beitragvon silentbreaker » Montag 3. April 2006, 20:23

also ungefähr so was hier?

Code: Alles auswählen

import Tkinter as tk
 
erfuellt = False
 
def func():
    #hier rein was erfuellt werden soll
    global erfuellt
    erfuellt = True

def schleife():
    while not erfuellt:
        print 'bla'

root = tk.Tk()
butt = tk.Button(root, text="Button", command=func)
butt.pack()

schleife()

root.mainloop()
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Beitragvon knekke » Montag 3. April 2006, 20:35

Dein Script funktioniert so nicht Silentbreaker, weil root.mainloop() erst nach der schleife gestartet wird, die ja aber solange läuft bis sie beendet wird... das geht ja nur wenn root.mainloop() läuft...

Wie wäre es hiermit?
Hier drückst du solange die Buttons bis ein bestimmtes Ereignis eintritt....
allerdings mal wieder ohne while-schleife (du hast ja auch noch nicht gesagt wofür du die brauchst ;) )

Code: Alles auswählen

#!/usr/bin/python

import Tkinter as tk

root = tk.Tk()
liste = []

def func(input):
    global liste
    liste.append(input)
    if len(liste)>3:
        print "Du hast folgende Tasten gedrueckt: ", liste
        liste = []

butt1 = tk.Button(root,text="Button 1",command=lambda: func(1)).pack()
butt2 = tk.Button(root,text="Button 2",command=lambda: func(2)).pack()
butt3 = tk.Button(root,text="Button 3",command=lambda: func(3)).pack()
butt4 = tk.Button(root,text="Button 4",command=lambda: func(4)).pack()

root.mainloop()
silentbreaker
User
Beiträge: 7
Registriert: Montag 3. April 2006, 17:58

Beitragvon silentbreaker » Montag 3. April 2006, 20:51

knekke hat geschrieben:Dein Script funktioniert so nicht Silentbreaker, weil root.mainloop() erst nach der schleife gestartet wird, die ja aber solange läuft bis sie beendet wird... das geht ja nur wenn root.mainloop() läuft...


stimmt, hab es auf die schnelle in der IDLE getestet. Und da läuft es ja auch so. Nebenbei aber auch noch vergessen, dass man ja kein mainloop() in der IDLE benutzen soll... :roll: Na ja, so ist das wenn man es eilig hat.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Beitragvon oscar15 » Dienstag 4. April 2006, 19:33

ich glaub wir reden immer noch vorbei, ich probiers noch einmal und wenn es dann nicht klappt bin ich ein hoffnungsloser fall!!

naja mein einziges Problem ist nicht die ausgabe, sondern, dass die buttons in einer Schleife stehen und als input dienen sollen.

Das Problem ist nur, dass die Schleife mir nicht die zeit lässt zu warten sondern einfach durchrauscht, ohne mich auch nur den button geklickt zu haben!
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Beitragvon knekke » Dienstag 4. April 2006, 21:40

Achtung, extrem schlampiger code:

Code: Alles auswählen

#!/usr/bin/python
 
import Tkinter as tk
a=5
root = tk.Tk()
warteAufMich = tk.IntVar()
warteAufMich.set(1)

def yo():
    global warteAufMich, a
    warteAufMich.set(1)
    a -= 1
 
def main():
    global a, root, warteAufMich
    while a>0:
        print a
        root.waitvar(warteAufMich)
    print "Ziel erreicht!"
    a = 5
   
butt = tk.Button(root, text="start", command=lambda: main()).pack()
butt1 = tk.Button(root, text="Input", command=lambda: yo()).pack()

root.mainloop()

'waitvar()' ist das was du suchst ....aber ich kann dir dazu nix erklären, da ich das selber gerade kennengelernt habe. Hab' auch keine Ahnung ob es hier richtig verwendet wurde, aber es funktioniert erstmal. Bitte um Berichterstattung, wenn du weisst wie man das richtig benutzt...
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Beitragvon oscar15 » Mittwoch 5. April 2006, 16:53

lol, ich würde ja gern sagen, dass es klappt und sicher klappt, es auch...naja...aber ich bekomme, die buttons jetzt nicht ausgegeben!!^^
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Beitragvon knekke » Mittwoch 5. April 2006, 17:29

und ich wuerde dir ja auch gerne sagen, dass ich dir an dieser Stelle helfen kann ohne deine Code zu sehen..... aber naja, das klappt leider nicht :wink:
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Beitragvon oscar15 » Mittwoch 5. April 2006, 21:35

oki, jetzt ist es spät, schicke ihn morgen!! ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder