2017-07-03 1 views
0

donc je travaille sur un minuteur rubics cube en python 3 (en utilisant tkinter).liaison ne fonctionne pas tkinter python3

Je suis en train de faire en sorte que lorsque vous appuyez sur l'espace, l'arrêt minuterie (à l'origine j'ai essayé de le faire pour démarrer et arrêter, mais je l'ai trouvé trop dur) j'ai essayé de lier la clé de l'espace à mon Arrêtez la fonction mais elle renvoie une erreur (quand j'applique un ensemble de parenthèses après avoir nommé la fonction à lier, pour une raison stupide pense que je passe 2 arguments.) Pourquoi cela ne fonctionne-t-il pas? voici mon code, Thx en avance pour la solution.

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() 

Répondre

1

Vous êtes très proche.

D'abord, la fonction bind a besoin de la fonction elle-même en tant qu'argument. Puisque vous avez le () à la fin, vous passez le résultat de l'exécution de la fonction, dans ce cas None. Il suffit de laisser les off:

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

En second lieu, la fonction qui bind appels doivent accepter un argument d'événement. Donc, vous devez le définir comme ceci:

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

cela fonctionne, merci beaucoup pour la réponse –