代码之家  ›  专栏  ›  技术社区  ›  RaspiManu

PyQt:如何在Raspberry Pi桌面启动上运行GUI?

  •  1
  • RaspiManu  · 技术社区  · 6 年前

    尊敬的Stackoverflow社区:,

    我正在与 跑步 执行的python脚本 桌面启动时的PyQt5 GUI 树莓皮3B和树莓杰西。

    到目前为止我有什么?

    • 带shebang的Python脚本 #!/usr/bin/env python3 在第一行中( python3 --version is 3.4.2)运行GUI时没有任何问题

    • 能够使用以下行执行GUI的Shell脚本(.sh):

      #!/bin/bash python3 GUI.py

    可能有帮助的信息:

    • 如果我将两个文件放在同一个目录中的某个地方,Shell脚本将启动GUI,但如果它们位于桌面上,则不会启动。

    • 已启用自动登录到桌面。

    提前感谢您的帮助。

    拉斯皮马努

    更新时间:

    我通过大量测试解决了问题,并为其他用户发布了答案。

    2 回复  |  直到 6 年前
        1
  •  3
  •   RaspiManu    6 年前

    经过多次测试,我自己找到了答案。这是我的工作原理。。。

    创建自动运行文件:

    2.1 LX终端: cd /home/pi/.config/autostart

    2.2 LX终端: sudo nano pythonscript.desktop

    2.3 pythonscript。桌面:

    [Desktop Entry]
    Version=1.0
    Name=YourName
    Comment=Your comment
    Exec=/home/pi/pythonscript.py -nograb #-nograb for comboBox on touch Screen
    Icon=/usr/share/pixmaps/python.xpm
    Path=/home/pi/
    Terminal=false
    StartupNotify=true
    Type=Application
    Categories=Utility;Application;
    

    2.4 Ctrl+O、Ctrl+X、, sudo reboot

    很高兴知道:

    重要的是,您不能只使用脚本的任何路径。脚本必须直接位于 /home/pi/ 目录,因此您可以使用 Exec=/home/pi/pythonscript.py 在自动运行文件(.desktop)中。我还了解到,如果您的脚本加载了例如一个带有PIL的图像,则该图像必须位于其他位置,可能位于您的桌面上,因为它无法从 /主页/pi/ 目录

    如果您的GUI有一个组合框,并且您正在使用触摸屏,那么在您触摸该组合框后,该组合框可能会使整个GUI无法使用。使用 Exec=/home/pi/pythonscript.py -nograb 解决此问题。

    StartupNotify=true 对于启动GUI脚本很重要。

    希望这有帮助,

    拉斯皮马努

        2
  •  0
  •   Axecalever    6 年前

    通过以下链接,您可以创建一个在启动时运行的后台服务 Service method

    再加上这一行

    service yourdaemon start
    

    英寸/英寸/英寸/英寸。地方的

    假设您的服务名为“yourdaemon”

    注意:使用根前缀

    示例服务文件

    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          yourdaemon
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Your Daemon
    # Description:       Your Daemon
    ### END INIT INFO
    
    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Your Daemon"
    NAME=yourdaemon
    DAEMON=/hannext/yourdaemon.py  # Path to your python file
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    LOGFILE=/var/log/snc/$NAME.log
    
    
    . /lib/lsb/init-functions
    
    do_start()
    {
            echo "$(date +%F) $(date +%T) DAEMON   : Starting $DESC service" >> $LOGFILE
            start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON --make-pidfile --background
    }
    
    do_stop()
    {
            echo "$(date +%F) $(date +%T) DAEMON   : Stopping $DESC service" >> $LOGFILE
            start-stop-daemon --stop $DAEMON --quiet --oknodo --pidfile $PIDFILE
            rm -f $PIDFILE
    }
    
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
            #
            # If the daemon can reload its configuration without
            # restarting (for example, when it is sent a SIGHUP),
            # then implement that here.
            #
            start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
            return 0
    }
    
    case "$1" in
      start)
            [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
            do_start
            case "$?" in
                    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
      stop)
            [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
            do_stop
            case "$?" in
                    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
      status)
            status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
            ;;
      #reload|force-reload)
            #
            # If do_reload() is not implemented then leave this commented out
            # and leave 'force-reload' as an alias for 'restart'.
            #
            #log_daemon_msg "Reloading $DESC" "$NAME"
            #do_reload
            #log_end_msg $?
            #;;
      restart|force-reload)
            #
            # If the "reload" option is implemented then remove the
            # 'force-reload' alias
            #
            log_daemon_msg "Restarting $DESC" "$NAME"
            do_stop
            case "$?" in
              0|1)
                    do_start
                    case "$?" in
                            0) log_end_msg 0 ;;
                            1) log_end_msg 1 ;; # Old process is still running
                            *) log_end_msg 1 ;; # Failed to start
                    esac
                    ;;
              *)
                    # Failed to stop
                    log_end_msg 1
                    ;;
            esac
            ;;
      *)
            #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
            echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
            exit 3
            ;;
    esac
    
    :
    

    在/etc/init中以“yourdemon”的名称保存它。并使用

    chmod +x yourdaemon