2017-07-03 14 views
0

also arbeite ich an einem rubic cube timer in python 3 (mit tkinter).bindung funktioniert nicht tkinter python3

Ich versuche, es zu machen, so dass, wenn Sie die Leertaste drücken, wird der Timer stoppt (ursprünglich habe ich versucht, diese zum Starten und Stoppen zu tun, aber ich fand es zu hart) Ich habe versucht, meinen die Leertaste zu binden Stopp-Funktion, aber es gibt entweder einen Fehler zurück (wenn ich einen Satz Klammern weggebe, nachdem ich die zu bindende Funktion benannt habe, denkt ich aus zwei dämlichen Gründen, dass ich 2 Argumente übergebe. IDK, warum das passiert) oder überhaupt nicht funktioniert. hier ist mein Code, Thx im Voraus für die Lösung.

from tkinter import * 
import time 

class StopWatch(Frame): 
""" Implements a stop watch frame widget. """                 
    def __init__(self, parent=None, **kw):   
     Frame.__init__(self, parent, kw) 
     self._start = 0.0   
     self._elapsedtime = 0.0 
     self._running = 0 
     self.timestr = StringVar()    
     self.makeWidgets() 


    def makeWidgets(self):       
     """ Make the time label. """ 
     l = Label(self, textvariable=self.timestr) 
     self._setTime(self._elapsedtime) 
     l.pack(fill=X, expand=NO, pady=2, padx=2)      

    def _update(self): 
     """ Update the label with elapsed time. """ 
     self._elapsedtime = time.time() - self._start 
     self._setTime(self._elapsedtime) 
     self._timer = self.after(50, self._update) 

    def _setTime(self, elap): 
     """ Set the time string to Minutes:Seconds:Hundreths """ 
     minutes = int(elap/60) 
     seconds = int(elap - minutes*60.0) 
     hseconds = int((elap - minutes*60.0 - seconds)*100)     
     self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds)) 

    def Start(self):              
     """ Start the stopwatch, ignore if running. """ 
     if not self._running:    
      self._start = time.time() - self._elapsedtime 
      self._update() 
      self._running = 1   

    def Stop(self):          
    """ Stop the stopwatch, ignore if stopped. """ 
     if self._running: 
      self.after_cancel(self._timer)    
      self._elapsedtime = time.time() - self._start  
      self._setTime(self._elapsedtime) 
      self._running = 0 
      print("fsddaewSDGNFHRAW") # a test to see if it works 

    def Reset(self):         
    """ Reset the stopwatch. """ 
     self._start = time.time()   
     self._elapsedtime = 0.0  
     self._setTime(self._elapsedtime) 

def main(): 

    root = Tk() 
    sw = StopWatch(root) 
    root.bind("<space>",sw.Stop()) # this is where i tried to bind 
    # if i did this: 
    #root.bind("<space>",sw.stop) it would say im passing 2 parameters instead of one (self) 
    sw.pack(side=TOP) 

    Button(root, text='Start', command=sw.Start).pack(side=LEFT) 
    Button(root, text='Stop', command=sw.Stop).pack(side=LEFT) 
    Button(root, text='Reset', command=sw.Reset).pack(side=LEFT) 
    Button(root, text='Quit', command=root.quit).pack(side=LEFT) 

    root.mainloop() 

if __name__ == '__main__': 
    main() 

Antwort

1

Sie sind sehr nah dran.

Zuerst benötigt die bind Funktion die Funktion selbst als Argument. Da Sie die () am Ende haben, übergeben Sie das Ergebnis der Ausführung der Funktion, in diesem Fall None. diejenigen aus lassen Sie einfach:

root.bind("<space>",sw.Stop) 

Zweitens, um die Funktion, die bind Anrufe ein Ereignisargument akzeptieren müssen. Also müssen Sie es so definieren:

def Stop(self, event=None): 
+0

es funktioniert, vielen Dank für die Antwort –