gpt4 book ai didi

python - GUI打不开

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:44 26 4
gpt4 key购买 nike

我编写了一个 python 脚本,用于扫描我的 gmail 收件箱以查找特定邮件,如果存在该邮件,它会打开一个 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 退出。有人可以阐明这件事并解释我做错了什么吗?

最佳答案

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

因此,NetworkManager 启动的任何脚本都不能(直接)访问 GUI。 (这与您从桌面切换到虚拟终端(例如 Ctrl-Alt-1),然后尝试从那里运行 GUI 时得到的结果非常相似:您很可能会收到类似“Can't打开显示”。

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

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

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

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

更新

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

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

关于python - GUI打不开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com