作用于单个对象

act on a single object

我们有一个定时器,我们想在其中一个 GPIO 变为 1 时停止其中一个定时器

到目前为止我们有这个代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from Tkinter import *
import time
from functools import partial
import RPi.GPIO as GPIO

class Chronometre(Frame):  # definition de la class'Chronomètre' dans Frame                                                            
    def __init__(self, parent=None, **kw):    # definition initiale de la class   
        Frame.__init__(self, parent, kw)
        self._start = 0.0      
        self._elapsedtime = 0.0
        self._running = 0
        self.timestr = StringVar()             
        self.makeWidgets()    

    def makeWidgets(self): #definition pour afficher le temps                       
        l = Label(self, textvariable=self.timestr)
        self._setTime(self._elapsedtime)
        l.pack(fill=X, expand=NO, pady=10, padx=10)                    

    def _update(self): # definition du reset
        self._elapsedtime = time.time() - self._start
        self._setTime(self._elapsedtime)
        self._timer = self.after(50, self._update)

        if(GPIO.input(22) ==1):
            print("Faux Départ!")

        if(GPIO.input(24) ==1):
            self.Stop()

        if(GPIO.input(23) ==1):
            self.Stop()

    def _setTime(self, elap): #définition du temps en minutes/secondes/millisecondes
        minutes = int(elap/60)
        seconds = int(elap - minutes*60.0)
        hseconds = int((elap - minutes*60.0 - seconds)*100)              
        self.timestr.set('%02d:%02d:%03d' % (minutes, seconds, hseconds))

    def Start(self, event=None): #lancement du chrono s'il est en arrêt                                                   
        if not self._running:          
            self._start = time.time() - self._elapsedtime
            self._update()
            self._running = 1      

    def Stop(self): # arrêt du chrono s'il est en marche                                  
        if self._running:
            self.after_cancel(self._timer)          
            self._elapsedtime = time.time() - self._start  
            self._setTime(self._elapsedtime)
            self._running = 0

    def Reset(self): # remise à zéro du chrono                               
        self._start = time.time()       
        self._elapsedtime = 0.0  
        self._setTime(self._elapsedtime)

    def get(self) :
        return self._running


def start_chronos(chronos, event):
    for chrono in chronos:
        chrono.Start()

def reset_chronos(chronos, event):
    for chrono in chronos:
        chrono.Reset()

def stop_chrono_gauche(chrono, event):
    chrono.Stop()

def stop_chrono_droit(chrono, event):
    chrono.Stop()

def main(): # definition de la fenetre de tkinter
    root = Tk()
    root.title('projet 2014-2015')
    chronoDroit = Chronometre(root)
    chronoDroit.pack(side=LEFT,padx=30,pady=30)
    chronoGauche = Chronometre(root)
    chronoGauche.pack(side=RIGHT,padx=30,pady=30)

    root.bind('<a>', partial(start_chronos, (chronoDroit, chronoGauche)))
    root.bind('<z>', partial(stop_chrono_gauche, (chronoDroit)))
    root.bind('<e>', partial(stop_chrono_droit, (chronoGauche)))
    root.bind('<r>', partial(reset_chronos, (chronoDroit, chronoGauche)))

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(22, GPIO.IN)
    GPIO.setup(23, GPIO.IN)
    GPIO.setup(24, GPIO.IN)

    root.mainloop()


if __name__ == '__main__':
    main()

我们正在尝试让计时器彼此独立停止,但它们同时停止

我们知道问题出在 self.Stop() 但我们不知道用什么来替换它

我们怎样才能让它发挥作用?

你的问题是你的所有对象都检查两个 GPIO,并在其中一个上停止——如果你想让你的对象有不同的行为,它们就必须不同。最简单的方法是告诉每个对象在构造它时应该检查什么 GPIO。作为一个浓缩示例:

class Chronometre(Frame):                                                           
    def __init__(self, gpio, parent=None, **kw):  
        ...
        self._stop_gpio = gpio
    ...
    def _update(self):
        ...
        if(GPIO.input(self._stop_gpio) == 1):
            self.Stop()

...

chronoDroit = Chronometre(23, root)
chronoGauche = Chronometre(24, root)