2017-05-02 2 views
0

날씨, 3 일간의 일기 예보, 뉴스 피드 및 트윗과 같은 다른 정보를 표시하는 스마트 미러를 만들려고합니다. 나는이 모든 정보를 창문에 인쇄하는 방법을 원했지만, 프로그램의 나머지 부분은 PIR 센서입니다.Tkinter PIR 센서

센서를 테스트했으며 자체적으로 작동하지만 창을 만들 수있는 방법을 생각할 수 없습니다. 그런 다음 센서가 데이터를 검색하여 기본적으로 모니터를 켜거나 끌 수 있습니다. 범위 내에있는 사람이있는 경우.

내가 말했듯이, 나는 tkinter 창을 표시하는 방법을 알아낼 수 없다는 사실 외의 다른 모든 코드 기능을 가지고있다. 그리고 나서 프로그램은 모니터를 켜기위한 모션 스캔을 시작한다. 꺼져. 이 시점에서 정보 (날씨, 트위터 등)를 업데이트 할 필요가 없습니다. 모니터를 켜고 끄는 것에 대해 걱정할뿐입니다. 또는 범위를 벗어날 때 이전에 꺼낸 정보를 다시 검게 표시하고 다시 표시하는 것에 대해 걱정합니다. .

저는 도움을 청하기로 결정하기 전에 모니터를 놓으려고했던 마지막 장소이기 때문에 처음에 모니터의 상태를 변경하는 데 사용한 예를 보았습니다.

내가 프로그램에서 mainloop 부분을 호출 할 때 다른 함수를 호출 할 수없는 것처럼 보인다고 생각합니다. 나는 틀릴 수도 있지만 이것이 보이는 방법입니다.

필자가 원하는 창 기능까지 프로그램을 썼습니다. 그래서 아래 제공된 코드를 사용하여 디스플레이를 만든 후 PIR 센서를 구현하여 디스플레이를 켜고 끕니다.

from tkinter import * 
import os, subprocess 
from gpiozero import * 

pir = MotionSensor (4) 

while True: 
if pir.motion_detected: 
    subprocess.call('xset dpms force on', shell=True) 
    print("yes") 
else: 
    subprocess.call('xset dpms force off', shell=True) 
    print("no") 






    #creates a fullscreen window and makes it black. 

     tk = Tk() 
     tk.configure(bg='black') 
     tk.attributes('-fullscreen', True) 


     tk.mainloop() 
+0

나는이 예제를 가능한 한 많이 자르는 것이 좋습니다.이 코드는 많은 코드를 통해 처리 할 수 ​​있습니다. 예를 들어,이 특정 질문에 대해'toggle_fullscreen'과'end_fullscreen' 함수가 정말로 필요한가요? 정말로 모든 레이블과 이미지가 필요합니까? [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) –

+0

코드를 훑어보기 쉽도록 코드를 썼습니다. – Snickledoof

+0

'pir.motion_detected'가 실행을 멈추거나 오랜 시간이 걸리나요? 아니면 매우 즉각적입니까? –

답변

0

tkinter 프로그램을 무한 while 루프와 함께 사용할 수없고 tkinter 메인 루프가 실행되기를 기대합니다.

gpiozero의 콜백을 사용하여 동작이 감지되었을 때 화면을 활성화하는 함수를 호출하고 지정된 기간 후에 화면을 끄는 tkinter.after 메서드를 사용하는 것이 좋습니다.

def myScreenOnFunction(): 
    subprocess.call('xset dpms force on', shell=True) 
    print("Screen On") 

.... 

pir = MotionSensor (4) 
pir.when_motion = myScreenOnFunction 

tk = Tk() 
tk.configure(bg='black') 
tk.attributes('-fullscreen', True) 


tk.mainloop() 

Tkinter에서는 이와 같이 동작해야하며 메인 루프가 실행되어야합니다.

+0

그래서 tkinter 콜백에 사용할 수있는 예제는'.after' 콜백과 같을 수 있습니까? 이것을 사용할 때 특정 기간 후에 디스플레이를 비활성화하는 함수를 호출 할 것이지만'.when_motion'을 다시 호출해야하거나 무기한으로 계속 볼 수 있습니까? – Snickledoof

+0

'.when_motion'으로 설정된 함수는 프로그램이 끝날 때까지 모션이 감지 될 때 호출됩니다. 예. 지정된 기간 후에 함수를 호출하려면'.after'를 사용할 수 있습니다. – scotty3785