2017-01-02 95 views
-1

我想要使用Openbox文件/etc/X11/openbox/autostart自動啓動一些PyQt程序。該Openbox的自動啓動成功發射下面的示例程序:爲什麼Openbox自動啓動不啓動某些程序?

/usr/bin/python /usr/share/test/test.py 

然而,自動啓動不啓動更復雜的程序(即:

import sys 
from PyQt4.QtGui import * 
application = QApplication(sys.argv) 
button = QPushButton("hello world", None) 
button.show() 
application.exec_() 

這是使用自動啓動文件,下面的命令啓動在這篇文章的末尾列出,取自here)。我已經確認,使用用戶帳號和root用戶帳號都可以成功啓動這個更復雜的程序,因此我不清楚爲什麼它不會使用Openbox自動啓動。

它在外殼使用以下命令啓動:

/usr/bin/python /usr/share/test/ucom-panel.py 

怎麼可以這樣更復雜的程序由Openbox的推出?

#!/usr/bin/env python 

""" 
################################################################################ 
#                    # 
# UCOM-panel                 # 
#                    # 
################################################################################ 
#                    # 
# LICENCE INFORMATION               # 
#                    # 
# This program is a desktop environment panel.         # 
#                    # 
# copyright (C) 2016 William Breaden Madden         # 
#                    # 
# This software is released under the terms of the GNU General Public License # 
# version 3 (GPLv3).               # 
#                    # 
# This program is free software: you can redistribute it and/or modify it  # 
# under the terms of the GNU General Public License as published by the Free # 
# Software Foundation, either version 3 of the License, or (at your option) # 
# any later version.               # 
#                    # 
# This program is distributed in the hope that it will be useful, but WITHOUT # 
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  # 
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for  # 
# more details.                # 
#                    # 
# For a copy of the GNU General Public License, see       # 
# <http://www.gnu.org/licenses/>.            # 
#                    # 
################################################################################ 

Usage: 
    program [options] 

Options: 
    -h, --help    display help message 
    --version    display version and exit 
    -v, --verbose   verbose logging 
    -s, --silent    silent 
    -u, --username=USERNAME username 
    --foregroundcolor=COLOR foreground color   [default: ffffff] 
    --backgroundcolor=COLOR background color   [default: 3861aa] 
    --paneltext=TEXT   panel text    [default: UCOM] 
    --windowframe=BOOL  include window frame  [default: false] 
    --alwaysontop=BOOL  set always on top  [default: true] 
    --setposition=BOOL  set launcher position [default: true] 
    --screennumber=NUMBER set launch screen number [default: -1] 
""" 

name = "UCOM-panel" 
version = "2016-12-23T0400Z" 
logo = None 

import docopt 
import logging 
import os 
import propyte 
from PyQt4 import QtGui, QtCore 
import subprocess 
import shijian 
import sys 
import threading 
import time 

def main(options): 

    global program 
    program = propyte.Program(
     options = options, 
     name = name, 
     version = version, 
     logo = logo 
    ) 
    global log 
    from propyte import log 

    program.color_1   = options["--foregroundcolor"] 
    program.color_2   = options["--backgroundcolor"] 
    program.panel_text  = options["--paneltext"] 
    program.window_frame  = options["--windowframe"].lower() == "true" 
    program.set_always_on_top = options["--alwaysontop"].lower() == "true" 
    program.set_position  = options["--setposition"].lower() == "true" 
    program.screen_number  = int(options["--screennumber"]) 

    application = QtGui.QApplication(sys.argv) 
    panel = Panel() 
    panel.move(
     application.desktop().screenGeometry(program.screen_number).left(), 
     application.desktop().screenGeometry(program.screen_number).top() 
    ) 
    sys.exit(application.exec_()) 

class Panel(QtGui.QWidget): 

    def __init__(
     self, 
     ): 
     super(Panel, self).__init__() 

     self.text_panel = QtGui.QLabel(program.panel_text) 

     self.indicator_percentage_power = QtGui.QLabel(self) 

     self.indicator_clock = QtGui.QLabel(self) 

     self.menu = QtGui.QMenu(self) 
     self.menu.addAction("Openbox Configuration Manager") 
     self.menu.addAction("unity-control-center") 
     self.menu.addAction("close panel") 
     self.menu.addAction("suspend") 
     self.menu.addAction("hibernate") 
     self.menu.addAction("reboot") 
     self.menu.addAction("shut down") 
     self.menu.triggered[QtGui.QAction].connect(self.process_menu) 

     self.button_menu = QtGui.QPushButton("settings") 
     self.button_menu.setMenu(self.menu) 

     hbox = QtGui.QHBoxLayout() 
     if program.panel_text != "": 
      hbox.addWidget(self.text_panel) 
     hbox.addStretch(1) 
     hbox.addWidget(self.indicator_percentage_power) 
     hbox.addSpacing(30) 
     hbox.addWidget(self.indicator_clock) 
     hbox.addSpacing(30) 
     hbox.addWidget(self.button_menu) 
     self.setLayout(hbox) 

     self.setStyleSheet(
      """ 
      color: #{color_1}; 
      background-color: #{color_2} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     self.text_panel.setStyleSheet(
      """ 
      QLabel{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     self.indicator_percentage_power.setStyleSheet(
      """ 
      QLabel{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     self.indicator_clock.setStyleSheet(
      """ 
      QLabel{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     self.menu.setStyleSheet(
      """ 
      QMenu{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      QMenu::item{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      QMenu::item::selected{{ 
       color: #{color_2}; 
       background-color: #{color_1}; 
       /* 
       border: 1px solid #{color_1}; 
       */ 
      }} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     self.button_menu.setStyleSheet(
      """ 
      QPushButton{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       border: none; 
       margin: 0px; 
       padding: 0px; 
      }} 
      QPushButton:pressed{{ 
       color: #{color_1}; 
       background-color: #{color_2}; 
       border: none; 
       margin: 0px; 
       padding: 0px; 
      }} 
      """.format(
       color_1 = program.color_1, 
       color_2 = program.color_2 
      ) 
     ) 

     if program.set_always_on_top is True: 
      self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) 
     if program.window_frame is False: 
      self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 
     if program.set_position is True: 
      self.move(0, 0) 
     self.resize(QtGui.QDesktopWidget().screenGeometry().width(), 15) 

     thread_percentage_power = threading.Thread(
      target = self.percentage_power 
     ) 
     thread_percentage_power.daemon = True 
     thread_percentage_power.start() 

     thread_clock = threading.Thread(
      target = self.clock 
     ) 
     thread_clock.daemon = True 
     thread_clock.start() 

     self.show() 

    def process_menu(
     self, 
     action 
     ): 
     action_text = action.text() 
     if action_text == "Openbox Configuration Manager": 
      shijian.engage_command("obconf") 
     if action_text == "unity-control-center": 
      shijian.engage_command("unity-control-center") 
     if action_text == "close panel": 
      program.terminate() 
     if action_text == "suspend": 
      shijian.engage_command("systemctl suspend") 
     if action_text == "hibernate": 
      shijian.engage_command("systemctl hibernate") 
     if action_text == "reboot": 
      shijian.engage_command("systemctl reboot") 
     if action_text == "shut down": 
      shijian.engage_command("systemctl poweroff") 

    def percentage_power(
     self 
     ): 
     while True: 
      percentage_power = shijian.percentage_power() 
      if percentage_power is None: 
       percentage_power = "100%" 
      self.indicator_percentage_power.setText(
       percentage_power 
      ) 
      time.sleep(30) 

    def clock(
     self 
     ): 
     while True: 
      self.indicator_clock.setText(
       shijian.time_UTC(
        style = "YYYY-MM-DD HH:MM:SS UTC" 
       ) 
      ) 
      time.sleep(1) 

if __name__ == "__main__": 
    options = docopt.docopt(__doc__) 
    if options["--version"]: 
     print(programVersion) 
     exit() 
    main(options) 
+2

很抱歉,如果我誤解但到底是什麼節目的內容都與能夠啓動它,因爲這似乎並沒有被有關命令行參數,它是關於運行它所需的命令。無論您從shell終端使用哪種命令,這都是您在啓動腳本中使用的。 – Schollii

+0

@Schollii嘿,那裏。我將在shell中用來啓動更復雜的程序的命令工作正常。當我將這個命令放入自動啓動時,程序似乎不會啓動。 – d3pd

+0

請確認當您將openbox自動啓動放入的shell命令複製到shell窗口時,它可以正常工作。 – Schollii

回答

1

沒有OPENBOX的日誌輸出,其中將顯示腳本運行時發生了什麼,這是不可能的,你可以得到一個答案。這可能是一個路徑問題,一個lib路徑問題,權限問題,安全級別問題等

這裏有一些事情要嘗試:

  • 查找OPENBOX日誌的輸出;你可能必須激活它。
  • 可能還有openbox的測試模式,您可以在shell窗口中通過命令行調用openbox;那麼你可以看到你是否有任何控制檯輸出。
  • 登錄你的命令的輸出到一個文件,並檢查它是什麼後OPENBOX自動啓動已運行:

    your_command >$HOME/openbox_log 2>&1 & 
    
  • 把你的命令腳本,並呼籲從自動啓動的,而不是用命令ARGS運行蟒(這是一個長鏡頭,但值得一試)