GUI not opening



我编写了一个python脚本,它扫描我的gmail收件箱中的特定邮件,如果该邮件存在,它会打开一个GUI。我已经测试了这个脚本和工作正确。我想在网络连接建立时运行这个脚本。因此,我在分派中添加了一个脚本。NetworkManager. d目录下。我的bash脚本如下:

#!/bin/bash
#/etc/NetworkManager/dispatcher.d/90filename.sh
IF=$1
STATUS=$2
if [ "$IF" == "wlan0" ];  # for wireless internet
then
    case "$2" in
        up)
        logger -s "NM Script up triggered"
        python /home/rahul/python/expensesheet/emailReader.py
    logger -s "emailReader completed"
    exitValue=$?
    python3.2 /home/rahul/python/expensesheet/GUI.py &
    logger -s "GUI completed with exit status $exitValue"
        ;;
        down)
        logger -s "NM Script down triggered"
        #place custom here
        ;;
        pre-up)
        logger -s "NM Script pre-up triggered"
        #place custom here
        ;;
        post-down)
        logger -s "NM Script post-down triggered"
        #place custom here
        ;;
        *)
        ;;
    esac
fi

我使用了tkinter来设计我的GUI。我的问题是,emailReader(没有GUI)得到正确执行,但GUI.py没有得到执行。它以退出状态1退出。有人能解释一下这件事吗?我做错了什么?

NetworkManager是在X-server之外的虚拟终端上运行的进程。(例如,NetworkManager在窗口管理器启动之前启动;

因此,任何由NetworkManager启动的脚本都不能(直接)访问GUI。(这非常类似于你从桌面切换到虚拟终端(例如Ctrl-Alt-1),然后尝试从那里运行你的GUI:你很可能会得到一个错误,如"不能打开显示"。

如果你想启动一个gui程序,你有两种可能

  • 告诉通知守护进程(窗口管理器的子进程)启动GUI
  • 告诉你的GUI在正确的显示器上启动(你的桌面正在运行的那个)

我选择第一个解决方案(通知守护进程就是为此目的而设计的),但是如何做到这一点,很大程度上取决于您使用的窗口管理器。

第二个解决方案有点脏,涉及潜在的安全漏洞,但基本上可以尝试启动DISPLAY=:0.0 myguiapp.py而不是启动myguiapp.py(这假设您在localhost:0.0上运行X-server)。您可以通过在虚拟终端上简单地使用DISPLAY-line启动命令来检查这是否有效。要获得实际使用的显示,只需在X-server的终端中运行echo $DISPLAY。通常,禁止远程连接到正在运行的Xserver(因为它允许未配置的用户接管您的桌面—从启动新的gui程序(这是您想要的)到安装键盘记录程序);如果是这种情况,检查man xhost(或去解决方案#1)

对于第一种解决方案,您可能想要检查libnotify之类的库(在python-notify和python-notify2中有python绑定)。

如果你想要的不仅仅是简单的"通知弹出",你可能必须深入研究D-BUS。可以在这里找到一个简单的示例(但我没有亲自测试过)。

相关内容

  • 没有找到相关文章

最新更新