2016-07-03 1 views
-4

저는 나무 딸기 파이, 16x2 LCD 디스플레이 및 일부 파이썬 코드가 포함 된 프로젝트가 있습니다. 필자는 본질적으로 lcd에 정보를 표시하는 동적 while 루프를 만들려고합니다. 나는 또한 터치 버튼 중 하나를 눌러 while 루프를 취소하는 기능을 추가하는 것을 시도하고있다 (참조 : https://github.com/pimoroni/dot3k/blob/master/python/REFERENCE.md가)Python - 반복 기능 (Raspberry Pi)이있는 반복문

이것은 내가 지금까지 무엇을 가지고 있습니다 :

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

루프가 실행되는 동안 만 단추를 누를 때 중단되지 않습니다. 아이디어?

+1

당신이 문제에 대한 자세한 내용을 주실 수 있습니까? 실행 중이거나 오류가 발생하고 있지 않습니까, 아니면 멈추지 않고 있습니까? –

+0

while 루프가 실행 중이지만 버튼을 눌렀을 때 중단됩니다. – Pigface333

+0

주석에 익숙하지 않습니다. 실제로 'cancel' 메서드가 실제로 사용 되었습니까? 거기에'print'를 추가하려 했습니까? 또한, 그 영역을 둘러싼 범위에 존재하는'i'를 변경하는 대신 새로운 로컬'i'를 생성하는 것으로 생각됩니다. –

답변

0

os (cmd)와 관련해서는 호출 할 수없는 'module'객체에 대한 오류가 발생하지만이를 수정했습니다.

코드 :

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

오류 메시지 btw : 'Traceback (최근 호출 마지막) : 파일 "test.py", 31 행, main() 파일 "test.py ", 29 행 메인 os (cmd) TypeError : '모듈'객체를 호출 할 수 없습니다. ' – Pigface333

+0

'os'는 모듈입니다. 원하는 것은'subprocess.call' 함수 일 것입니다.하지만 종료 할 수도 있습니다. 'exit (0)'을 사용하여 코드를 작성하거나 자연스럽게 종료하도록하십시오. –

-1

나는 LCD 디스플레이가 없으므로 코드를 테스트 할 수 없습니다. 하지만 @ Pigface333이 맞는 것 같아 안에있는 cancel은 로컬 변수이므로 Cancel을 누른 후 if 문에 i이 1로 설정되지 않습니다.

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

inside cancel 1 초를 인쇄하지만 cancel 내부의 i이 지역 변수임을 보여 종료되지 않습니다 : 다음 코드는 것을 보여줍니다.

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

가 원래의 코드가 작동하지 않은 이유를 이해하는 데 도움하려면 다음과 같은 방법을 코드에 적용 할 수

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

:이 문제를 해결하려면, 당신은 취소 상태를 저장하는 클래스를 만들 수 있습니다 그리고 클래스를 사용하는 것이 좋은 아이디어 인 이유는 파이썬의 variable's scopeObject-Oriented Prograaming in Python에 관한 글을 추천합니다.

+0

이것은 전역 변수에 대한 액세스를 추가하는 매우 복잡한 방법입니다 – barny