2016-08-03 34 views
0

我在我的佈局的許多不同位置創建類添加小部件矩形。 即時運行返回錯誤GPIO最安裝(),即時配置端口在第11行,我的代碼有什麼問題?Python Kivy Raspberrypi錯誤GPIO頻道

> Traceback (most recent call last): File "plantadeira.py", line 50, 
> in <module> 
>  MainApp().run() File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 828, in run 
>  runTouchApp() File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 487, in 
> runTouchApp 
>  EventLoop.window.mainloop() File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", 
> line 90, in mainloop 
>  self._mainloop() File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", 
> line 85, in _mainloop 
>  EventLoop.idle() File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 327, in 
> idle 
>  Clock.tick() File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 581, in 
> tick 
>  self._process_events() File "kivy/_clock.pyx", line 368, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7219) File "kivy/_clock.pyx", 
> line 398, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7102) File "kivy/_clock.pyx", 
> line 396, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7032) File "kivy/_clock.pyx", 
> line 168, in kivy._clock.ClockEvent.tick 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:3109) File "plantadeira.py", 
> line 26, in update 
>  if self.read_Sensor(pin) == False: File "plantadeira.py", line 36, in read_Sensor 
>  sensor = GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000) RuntimeError: You must setup() the GPIO channel as an input first 

這是我的代碼蟒蛇:

from kivy.app import App 
from kivy.clock import Clock 
from kivy.graphics import Color, Rectangle 
from kivy.properties import NumericProperty 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
import RPi.GPIO as GPIO 


GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) 
pin_1 = 17 

class MainLayout(FloatLayout): 
    pass    

class bar(Widget): 

    r = NumericProperty(1) 
    def __init__(self, pin, p1, p2, s1, s2, **kwargs): 
     super(bar, self).__init__(**kwargs)   
     Clock.schedule_interval(self.update, 0.5) 

    def update(self, pin): 
     if self.read_Sensor(pin) == False: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2)) 
     else: 
      with self.canvas: 
       Color(self.r, 1, 1, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2))    

    def read_Sensor(self, pin): 
     sensor = GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000) 
     if sensor is None: 
      return False 
     else: 
      return True 

class MainApp(App): 
    def build(self): 
     self.mainlayout = Widget() 
     bar1 = bar(pin_1, 1, 10, 60, 100) 
     self.mainlayout.add_widget(bar1) 
     return self.mainlayout 

if __name__ == '__main__': 
    MainApp().run() 

回答

0

在你的代碼的問題是,當你撥打:
GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000)
不能使用int(pin)但你在上課前定義的,而不pin_1
所以,你可以這樣調用它來代替:
GPIO.wait_for_edge(pin_1, GPIO.RISING, timeout=1000)

如果你想在你的代碼中使用pin,你必須在對象的啓動將其定義爲self.pin = pin。 (init)。然後在課程的任何地方將其稱爲self.pin。您不需要將它作爲更新中的參數傳遞 - 在這種情況下,請使用read_Sensor方法。除非你有幾個引腳,但是你需要傳遞一個數字給read_Sensor方法。你不會在你的代碼中這樣做。您不會將任何數字傳遞給更新方法。
針在你的情況變得鍾dt,(增量時間)從文檔https://kivy.org/docs/api-kivy.clock.html

如果你看你看,int(pin)從未設定爲輸入錯誤。如之前所提到的int(pin)是時鐘增量時間,所以它永遠不會相同。 RuntimeError: You must setup() the GPIO channel as an input first

而只是爲了說明如何重寫這個:

from kivy.app import App 
from kivy.clock import Clock 
from kivy.graphics import Color, Rectangle 
from kivy.properties import NumericProperty 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
import RPi.GPIO as GPIO 


GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) 
pin_1 = 17 

class MainLayout(FloatLayout): 
    pass 

class bar(Widget): 

    r = NumericProperty(1) 
    def __init__(self, pin, p1, p2, s1, s2, **kwargs): 
     super(bar, self).__init__(**kwargs) 
     Clock.schedule_interval(self.update, 0.5) 
     self.pin = pin 

    def update(self, dt): 
     if self.read_Sensor() == False: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2)) 
     else: 
      with self.canvas: 
       Color(self.r, 1, 1, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2))    

    def read_Sensor(self, pin=self.pin): # you dont need to pass anything to this method. It will default to self.pin. But if you need it for other sensors, you can pass an integer.                        
     sensor = GPIO.wait_for_edge(pin, GPIO.RISING, timeout=1000)                 
     if sensor is None: 
      return False 
     else: 
      return True 

class MainApp(App): 
    def build(self): 
     self.mainlayout = Widget() 
     bar1 = bar(pin_1, 1, 10, 60, 100) 
     self.mainlayout.add_widget(bar1) 
     return self.mainlayout 

if __name__ == '__main__': 
    MainApp().run() 
+0

非常感謝,工作! –

+0

@VictorSued很棒。沒問題。 – EL3PHANTEN