-1

我试图让一些 PyQt 程序使用 Openbox 文件自动启动/etc/X11/openbox/autostart。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

但是,自动启动不会启动更复杂的程序(在本文末尾列出并取自此处)。我已经确认使用用户和 root 帐户成功启动了更复杂的程序,所以我不清楚为什么它没有使用 Openbox 自动启动启动。

它在 shell 中使用以下命令启动:

/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)
4

2 回答 2

1

如果没有 openbox 的日志输出,它将显示脚本运行时发生的情况,您不太可能得到答案。可能是路径问题、库路径问题、权限问题、安全级别问题等。

以下是一些可以尝试的事情:

  • 找到openbox的日志输出;您可能必须激活它。
  • openbox 可能还有一个测试模式,您可以在 shell 窗口中从命令行调用 openbox;然后你可以看看那里是否有任何控制台输出。
  • 将命令的输出记录到文件中,并在 openbox 自动启动运行后检查其中的内容:

    your_command >$HOME/openbox_log 2>&1 &
    
  • 将您的命令放在脚本中并从自动启动调用它,而不是使用命令 args 运行 python(这是一个很长的镜头,但值得一试)

于 2017-01-03T13:47:33.770 回答
0

如果您发布您的 会更有帮助autostart,因此我们可以查看并搜索解决方案。由于您没有这样做,我将在这里猜测一下。您将命令按顺序放置在每个命令末尾的autostart没有。&

所以当autostart运行时/usr/bin/python /usr/share/test/test.py,它会挂起,等待test.py结束才能运行/usr/bin/python /usr/share/test/ucom-panel.py。我怀疑如果您添加&到每个命令的末尾,它们就会按您的预期工作。

告诉 shell在&后台运行命令并转到下一个命令。

我建议您回滚/etc/X11/openbox/autostart到以前的状态,然后进行编辑/home/<username>/.config/openbox/autostart,如下所示:

#!/bin/sh
/usr/bin/python /usr/share/test/test.py &
/usr/bin/python /usr/share/test/ucom-panel.py &
于 2018-08-09T05:24:42.373 回答