2017-04-23 4 views
0

나는이 코드를 사용하여 Raspbian Jessie 데스크탑에 알림을 표시하기 위해 며칠 동안 싸워 왔습니다. 나는 Notify, notify2 및 notify-send를 시도했으며 그들은 모두 IDLE에서 작동하지만 명령 행에서는 작동하지 않습니다. Notify는 (터미널에서 직접 호출 할 때 제대로 작동합니다.) noify2는 IDLE에서 실행 한 후 명령 행에서 잠시 동안 작동했지만 결국 알림 제공을 중단하지만 python 코드가 작동하지 않습니다 (subprocess.Popen을 통해 호출 됨). 오류는 제공되지 않습니다.Notify2는 Python3 IDLE에서 작동하지만 항상 터미널에있는 것은 아닙니다.

버튼을 누르면 시스템에서 rtsp 카메라 피드를 시작하는 데 걸릴 수있는 최대 10 초가 소요될 수 있으므로 사용자가 입력을 받았음을 알리고 싶습니다. 파이썬에서 빠른 알림을 팝업하는 또 다른 방법이 있다면, 나는 아이디어에 대해 열려 있습니다 (tkinter?).

코드가 LXDE - 파이/자동 시작에라는 bash는 스크립트에서 호출됩니다

#!/usr/bin/env python 
import RPi.GPIO as GPIO 
import time 
import schedule 
import subprocess 
import os 
from subprocess import call 
import notify2 
import sys; print(sys.executable) 
print(os.getcwd()) 
notify2.init("Buttons") 

os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority') 
os.environ.setdefault('DISPLAY', ':0.0') 
GPIO.setmode(GPIO.BCM) 

GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP) #* 
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) #MIC 
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP) #CAM 
GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP) #BRIGHTNESS 
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) #POWER 


input_state1 = GPIO.input(26) 
input_state2 = GPIO.input(19) 
input_state3 = GPIO.input(13) 
input_state4 = GPIO.input(6) 
input_state5 = GPIO.input(5) 
print(time.asctime(time.localtime(time.time()))) 
print('Button State: ', input_state1, input_state2, input_state3, input_state4, input_state5) 
cam_state=False 

n = notify2.Notification("Buttons!", "Waiting for you to push something.") 
n.show() 
brightness = str(subprocess.check_output(["ddcutil", "getvcp", "10"])) 
brightness = brightness[brightness.find('=',4):brightness.find(',')] 
brightness = brightness[1:].strip(' ') 
if brightness == '0': 
    disp_state=1 
    print('Startup brightness is 0%') 
elif brightness == '1': 
    disp_state=0 
    print('Display is off') 
else: 
    disp_state=2 
    print('Startup brightness is >0%') 

def job(): 
    rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"]) 
    print('Checking for down cameras') 

def night(): 
    rc = subprocess.call(["ddcutil", "setvcp", "10", "1"]) 
    rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"]) 
    disp_state=0 
    print('Starting night mode') 

def day(): 
    rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"]) 
    rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
    disp_state=2 
    print('Starting day mode') 

schedule.every().day.at("23:30").do(night) 
schedule.every().day.at("06:00").do(day) 
schedule.every().wednesday.at("07:15").do(night) 
schedule.every().thursday.at("07:15").do(night) 

while True: 
    input_state1 = GPIO.input(26) #* 
    input_state2 = GPIO.input(19) #MIC 
    input_state3 = GPIO.input(13) #CAM 
    input_state4 = GPIO.input(6) #BRIGHTNESS 
    input_state5 = GPIO.input(5) #POWER 

    if input_state3 == False: 
     print('Camera Button Pressed') 
     time.sleep(0.2) 
     if cam_state == False: 
      n = notify2.Notification("Starting Cameras", "May take up to 10 seconds...", "camera-video") 
      rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"]) #repair like start but won't double start if running 
      cam_state=True 
      schedule.every(3).minutes.do(job).tag('repair-cams') 
     else: 
      n = notify2.Notification("Stopping Cameras", "Standby...", "camera-video") 
      rc = subprocess.call(["/home/pi/py_switch/cams.sh", "stop"]) 
      cam_state=False 
      schedule.clear('repair-cams') 
    if input_state4 == False: 
     print('Brightness button Pressed') 
#  rc = subprocess.Popen('DISPLAY=:0 notify-send "Changing Brightness..." "100% -> 0% -> Off ->" -i dialog-information', shell=True) 
     n = notify2.Notification("Changing brightness", "100% -> 0% -> Off ->", "dialog-information") 
     time.sleep(0.2) 
     if disp_state == 3: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "50"]) 
       disp_state=2 
     elif disp_state == 2: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "0"]) 
       disp_state=1 
     elif disp_state == 1: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "1"]) 
       rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"]) 
       disp_state=0 
     elif disp_state == 0: 
       rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"]) 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
       disp_state=2 #changed to 2 to from 3 to bypass 50% brighness 
    if input_state5 == False: 
     print('Power button Pressed') 
     start = time.time() 
     time.sleep(0.2) 
#  rc = subprocess.Popen('DISPLAY=:0 notify-send "Hold for 5s to shutdown." -i system-shutdown', shell=True) 
     n = notify2.Notification("Shutdown?", "Hold for 5s to shutdown.", "system-shutdown") 
     while input_state5 == False: 
      time.sleep(0.1) 
      print('Holding down 3') 
      end = time.time() 
      press_time = end-start 
      # print(press_time) 
      input_state5 = GPIO.input(5) 
      if press_time > 5: 
       print('Shutting down?') 
       os.system('sudo shutdown -h now') 

    if input_state2 == False: 
     print('Microphone button Pressed') 
     time.sleep(0.2) 
     #rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
    if input_state1 == False: 
     print('Star button Pressed') 
     time.sleep(0.2) 
    time.sleep(0.1) 
    schedule.run_pending() 

내가 통지를 유지하는 특별한 무언가를해야하나요 : 여기

#!/bin/sh 
# launcher.sh 
cd/
cd home/pi/py_switch 
while true; do 
      python3.4 buttons.py 
      echo -----------------------RESTARTING CODE------------ 
     done 
cd/

것은 buttons.py입니다 데몬이 실행 중입니까? 나는 통지 - 데몬, 통지 - OSD를 가지고 있고 거의 모든 다른 패키지 Google 검색은 내가 설치 제안 : 질문에 게시

(zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null | 
    egrep '^(Start-Date:|Commandline:)' | 
    grep -v aptdaemon | 
    egrep -B1 '^Commandline:' 
Commandline: apt-get install notification-daemon 
Commandline: apt-get install python-notify 
Commandline: apt-get install python-dev python-rpi.gpio 
Commandline: apt-get install python-gobject libnotify-bin libnotify-dev 
Commandline: apt-get install xorg-dev libglu1-mesa-dev 
Commandline: apt-get install libudev-dev 
Commandline: apt-get install libusb-dev 
Commandline: apt-get install libusb-1.0.0-dev 
Commandline: apt-get install screen 
Commandline: apt-get install xosd-bin 
Commandline: apt-get install libgtk2.0-dev libglib2.0-dev libnotify-dev 
Commandline: apt-get install libnotify-cil-dev 
Commandline: apt-get install notify-osd 
Commandline: apt-get install unclutter 
Commandline: apt-get install python3-notify2 

답변

0

코드는 간헐적으로 작동하지만 오류 메시지가 발생하지 않았다. 긴급 (긴급 (n.set_urgency(notify2.URGENCY_CRITICAL))) 설정을 추가하려고 시도했지만 도움이되지 않았습니다.

--urgency=critical을 사용하여 알림 전송을 호출하면 알림이 안정적으로 나타납니다.

근무 예 :

rc = subprocess.Popen('DISPLAY=:0 notify-send --urgency=critical "Changing Brightness..." "100% -> 0% -> Off ->" -i dialog-information', shell=True)