2016-07-03 8 views
-4

Ich habe ein Projekt, das eine Raspberry Pi, die Dothat 16x2 LCD-Display und einige Python-Code beinhaltet. Ich versuche im Wesentlichen eine dynamische While-Schleife zu erstellen, die Informationen auf dem LCD anzeigt. Ich bin auch eine Funktion hinzuzufügen versuchen, die durch Drücken einer der Touch-Tasten (Referenz: https://github.com/pimoroni/dot3k/blob/master/python/REFERENCE.md) die while-Schleife brichtPython - Breaking While-Schleife mit Funktion (Raspberry Pi)

Das ist, was ich bisher habe:

import dothat.lcd as l 
import dothat.backlight as b 
import dothat.touch as t 
from time import sleep 
import signal 
import os 

def main(): 
    i=0 
    k=0 
    while True: 
      l.clear()     # Clear LCD screen 
      b.hue(1.5)     # Set background color 
      l.set_cursor_position(0, 1) # Set cursor position on LCD 
      l.write("%s" % k)   # Write variable "k" to LCD 
      @t.on(t.CANCEL)    # When CANCEL button is pressed then go to function 
      def cancel(ch, evt):   
       i=1     # Set variable "i" as 1 
       return 
      if i == 1:     
       break 
      k=k+1 
      sleep(1) 
    l.clear()       # Clear LCD screen 
    b.off()       # Turn the LCD Backlight off 
    cmd='pkill python'    # 
    os(cmd)       # Kill all python processes 
    signal.pause()      
main()         

Die while-Schleife läuft, aber Es bricht nicht, wenn die Taste gedrückt wird. Ideen?

+1

Können Sie mehr Details über das Problem? Läuft es nicht/wirft einen Fehler, oder hört es einfach nicht auf? –

+0

Die While-Schleife läuft, aber sie bricht nicht, wenn die Taste gedrückt wird. – Pigface333

+0

Ich kenne diese Annotation nicht. Sind Sie sicher, dass die Methode 'cancel' tatsächlich verwendet wird? Haben Sie versucht, dort einen 'Print' hinzuzufügen? Außerdem glaube ich, dass _if_ es verwendet wurde, würde es ein neues lokales "i" erstellen, anstatt das "i" zu ändern, das im umschließenden Bereich existiert. –

Antwort

0

Ich reparierte es, obwohl ich Fehler über das 'Modul' Objekt bekomme, das bezüglich os (cmd) nicht aufrufbar ist.

Der Code:

def main(): 
    global i 
    i=0 
    k=0 
    while True: 
      l.clear() 
      b.hue(1.5) 
      l.set_cursor_position(0, 1) 
      l.write("%s" % k) 
      @t.on(t.CANCEL) 
      def cancel(ch, evt): 
       global i 
       i=1 
       return 
      if i == 1: 
       break 
      k=k+1 
      sleep(1) 
    l.clear() 
    b.off() 
    cmd='pkill python' 
    os(cmd) 
    signal.pause() 
main() 
+0

die Fehlermeldung btw: 'Traceback (letzten Aufruf zuletzt): Datei "test.py", Zeile 31, in main() Datei "test.py ", Zeile 29, in Haupt os (cmd) TypeError: 'Modul' Objekt ist nicht aufrufbar ' – Pigface333

+0

' os' ist ein Modul, was Sie wollen, ist wahrscheinlich die 'subprocess.call' Funktion. Aber Sie könnten auch beenden Dein Code mit 'exit (0)', oder lass es einfach enden. –

-1

Ich habe kein dothat LCD-Display, daher kann ich Ihren Code nicht testen. Aber ich denke, @ Pigface333 war richtig, i innerhalb cancel ist eine lokale Variable, so dass die i in Ihrer if-Anweisung nicht auf 1 nach dem Drücken von Abbrechen gesetzt wird. Der folgende Code zeigt, dass:

from time import sleep 

def main(): 
    i = 0 
    k = 0 
    while True: 
     def cancel(): 
      print "inside cancel" 
      i = 1 
      return 
     cancel() 
     if i == 1: 
      break 
     k = k+1 
     sleep(1) 
    exit(0) 
main() 

Diese inside cancel alle 1 Sekunden gedruckt werden, wird aber nicht verlassen, was zeigt, dass die i innerhalb cancel eine lokale Variable ist. Um es zu beheben, können Sie eine Klasse erstellen, die Stornostatus speichert:

from time import sleep 

class Cancel(object): 

    def __init__(self): 
     self.is_cancelled = False 

    def cancel(self): 
     self.is_cancelled = True 


def main(): 
    canceller = Cancel() 
    while True: 
     canceller.cancel() 
     if canceller.is_cancelled: 
      break 
     sleep(1) 
    exit(0) 
main() 

Das gleiche Verfahren kann auf Code angewendet werden:

import dothat.lcd as l 
import dothat.touch as t 
import dothat.backlight as b 
from time import sleep 
import signal 


class Cancel(object): 

    def __init__(self,): 
     self.is_cancelled = False 

    @t.on(t.CANCEL) 
    def cancel(self, ch, evt): 
     self.is_cancelled = True 
     return 


def main(): 
    k = 0 
    cancel = Cancel() 
    while True: 
     l.clear()     # Clear LCD screen 
     b.hue(1.5)     # Set background color 
     l.set_cursor_position(0, 1) # Set cursor position on LCD 
     l.write("%s" % k)   # Write variable "k" to LCD 
     if cancel.is_cancelled: 
      break 
     k = k+1 
     sleep(1) 
    l.clear()       # Clear LCD screen 
    b.off()       # Turn the LCD Backlight off 
    signal.pause() 
    exit(0) 
main() 

zu helfen, zu verstehen, warum der ursprüngliche Code nicht funktioniert und warum die Verwendung einer Klasse eine gute Idee ist, empfehle ich, über Pythons variable's scope und Object-Oriented Prograaming in Python zu lesen.

+0

Dies ist eine sehr komplizierte Möglichkeit zum Hinzufügen von Zugriff auf eine globale Variable – barny