我一直在爭取這段代碼幾天,讓它在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