2017-04-23 85 views
0

我一直在爭取這段代碼幾天,讓它在Raspbian Jessie桌面上顯示通知。我已經嘗試過通知,通知2和通知發送,它們都是從IDLE工作,但不是從命令行不工作。通知崩潰了python代碼,notify-send(通過subprocess.Popen調用)沒有做任何事情(從終端直接調用時沒有問題),notify2在從IDLE運行它後終止了命令行,但最終停止提供通知。永遠不會有錯誤發生。Notify2從Python3 IDLE工作,但並不總是在終端

我正在使用通知系統,因爲一旦按下按鈕,系統啓動rtsp攝像頭供稿可能需要10秒以上的時間,我希望用戶知道他們的輸入已收到。如果有另一種方式從Python彈出一個快速通知,我可以接受想法(tkinter?)。

代碼是由稱爲LXDE-π/自動啓動一個bash腳本調用:

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

這裏是buttons.py:

#!/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() 

我需要做一些特別的東西,以保持通知守護進程運行?我有通知守護,通知,OSD和所有其他的包穀歌搜索建議我安裝:

(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調用notify-send,通知顯示可靠。

工作例如:

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