2017-01-02 13 views
-1

Я пытаюсь запустить несколько программ PyQt, используя файл Openbox /etc/X11/openbox/autostart. Автозапуск Openbox успешно запускает следующий пример программы:Почему автозапуск Openbox не запускает некоторые программы?

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

Это запускается с помощью следующей команды в файле автозапуска:

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

Однако автостарта не запускает более сложную программу (т.е. перечисленные в конце этого сообщения и взятые из here). Я подтвердил, что более сложная программа успешно запускается как с пользовательскими, так и с корневыми учетными записями, поэтому мне непонятно, почему она не запускается с автозапуском 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

Извините, если я не понимаю, но что делает содержание программы связано с возможностью ее запуска, поскольку это не похоже на командную строку аргументы, это о команде, необходимой для ее запуска. Независимо от того, какую команду вы используете из терминала оболочки, это то, что вы будете использовать в сценарии запуска. – Schollii

+0

@Schollii Эй там. Команда, которую я буду использовать в оболочке для запуска более сложной программы, работает нормально. Когда я помещаю эту команду в автозапуск, программа тогда не запускается. – d3pd

+0

Пожалуйста, подтвердите, что при копировании команды, которую вы вставляете в автозапуск openbox в окно оболочки, она работает. – Schollii

ответ

1

Без выхода журнала openbox, где он покажет, что произошло при запуске скрипта, вряд ли вы сможете получить ответ. Это может быть проблема ПАОГО Lib вопрос пути, проблема с разрешениями, проблема уровня безопасности и т.д.

Вот некоторые вещи, чтобы попробовать: выход журнала

  • Найти Openbox в; вам, возможно, придется активировать его.
  • Также может быть тестовый режим для openbox, где вы можете вызвать openbox из командной строки в окне оболочки; то вы можете увидеть, есть ли там какой-либо выход на консоль.
  • Входа выхода вашей команды в файл и проверить, что в нем после того, как Openbox автозапуск закончилась:

    your_command >$HOME/openbox_log 2>&1 & 
    
  • Положите вашу команду в сценарии и называют, что с автозапуска вместо запуска питона с командным аргом (это длинный выстрел, но стоит попробовать)