如何用 python 应用程序替换桌面界面

how to replace the desktop interface with a python application

我正在创建一个 GUI 界面,它将使用带有 raspberry pi 的 7" 触摸显示屏 3. 我希望 GUI 取代桌面,我不希望它显示在 window 在桌面上。关于如何做到这一点的任何想法。我已经阅读了 raspberry pi 文档以编辑 rc.local 脚本以在登录时启动应用程序,但我不知道如何在不创建 window

的情况下设置 python GUI

你的 pi 启动并显示一个控制台 - 只是文本 - 通过 运行ning 一个程序 (getty)。然后你 运行 另一个应用程序称为图形显示管理器,然后 运行 是一个 window 管理器。在 pi 上,它通常是 gnome,但还有很多其他的,.. 这个 window 管理器是显示你的 GUI window 的。你想要的显然是可能的,只是做起来不简单。您所说的是信息亭模式应用程序仍然 运行ning 'on the desktop' 正如您所说,但它完全遮盖了桌面并且不允许您切换或散焦或更复杂的 JeOS 之类的Kodi/XBMC 裸机安装 运行ning 没有你当前的 window 经理。您的 python 必须完成显示管理器和 window 管理器的工作,而且速度会非常非常慢。

使用真正轻便的 window 管理器并进入信息亭模式。或者你可以用文字去!有一些库,例如 ncurses,但我不确定它如何与您的触摸屏显示器一起使用。

1。 禁用图形界面,即从 运行ning 停止桌面管理器。 在 Raspbian 上,您可以使用 raspiconfig 来完成它。

2。 设置自动登录 bash

3。 自动阻止 startx 运行ning 桌面管理器

4。 添加您的应用程序以在执行自动登录时从 .bash_rc 开始。

要设置自动登录,首先在 /bin 目录中创建一个名为 autologin 的脚本:

#! /bin/bash
/bin/login -f pi

注意:pi 是 raspbian 上的用户,在执行 sudo 时不会要求输入密码。

要使用创建的脚本编辑 /etc/inittab:

向下滚动到分配终端的位置并将 tty1 的行更改为:

1:2345:respawn:/sbin/getty -n -l /bin/autologin 38400 tty1 

注意 ID 与旧的 tty1 设置相匹配。 然后在用户的主目录 (/home/pi) 中添加(如果它不存在的话)一个名为“.xinitrc”的文件只包含:

#! /bin/bash
cat

这将阻止 X 服务器在启动时调用桌面管理器。

现在添加 /home/pi 的 .bashrc 你的应用程序或更好的脚本,它将 运行 你的应用程序(最后):

export DISPLAY=:0
/home/pi/Desktop/appstart &
startx

appstart 是:

#! /bin/bash

# Wait a second for X server to start:
sleep 1
# Now X is running and we have to switch into video terminal using chvt (change virtual terminal) command
# Graphic terminal is on Raspbian tty7
sudo chvt 7
# Start the app:
python /home/pi/Desktop/myapp/myapp.py

所有这些设置完成后会发生以下情况:

1。 你 运行 Raspberry Pi 并且它自动登录到用户 pi

2。 当 Bash 登录时执行 /home/pi/.bashrc

3。 .bashrc 设置 $DISPLAY 变量,因为还没有 X 显示,运行s 启动脚本作为后台作业并启动 X 服务器。

4。 X 服务器不会进入桌面管理器,因为 /home/.xinitrc 会在它之前停止它。

5。 启动脚本休眠一秒钟以确保 X 正在 运行ning 并能够将图形发送到 tty7,切换到 tty7 以便用户不必手动执行,然后 运行s 您的应用程序这将出现。 如果您的应用程序不是图形化的,您将只会看到一个很大的空缺。 :D

这里的问题是你绝对应该为这个东西创建一个用户。如果您的应用程序崩溃或用户切换到 tty1 并终止 X,则 he/she 在 bash 中,已登录。

取决于您需要的安全级别。您可以做很多事情来防止滥用。例如,使用 fcntl 改变 tty1 所处的模式,使其不再接收按键输入。 或者使用一些其他的技巧,或者稍微重新安排这个过程,或者确保 tty1 运行s jobs 中的所有内容都带有 nohup,然后注销等