GUI无法打开

时间:2013-01-12 05:06:43

标签: python linux bash user-interface

我编写了一个python脚本,用于扫描我的gmail INBOX中的特定邮件,如果该邮件存在,则会打开一个GUI。我测试了这个脚本并且正常工作。 我想在建立网络连接时运行此脚本。所以,我在NetworkManager的dispatch.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退出。 有人可以对这个问题有所了解并解释我做错了吗?

1 个答案:

答案 0 :(得分:1)

NetworkManager是在X服务器外部的虚拟终端上运行的进程。 (例如,在窗口管理器启动之前,NetworkManager将在启动时启动;它们完全不相关)。

因此,NetworkManager启动的任何脚本都不会(直接)访问GUI。 (它与您从桌面更改为虚拟终端(例如Ctrl-Alt-1)时所获得的非常类似,然后尝试从那里运行GUI:您很可能会收到类似“不能”的错误打开显示“。

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

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

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

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

<强>更新

对于第一个解决方案,您可能想要查看像libnotify这样的库(python-notifypython-notify2中有python绑定)。

如果你想要的不仅仅是简单的“通知弹出窗口”,你可能需要深入研究D-BUS。 一个简单的例子(尽管没有亲自测试过),可以找到here