Kivy: Buster RPi4B 无法从无桌面控制台找到有价值的 Window 提供程序

创建于 2019-08-15  ·  113评论  ·  资料来源: kivy/kivy

将 Raspberry Pi 4B 登录到命令行(使用 raspi-config 引导至 CLI)后,由于在尝试使用任何 kivy Window provider:egl_rpi、sdl2、pygame 或 x11 时出现严重错误,无法执行 kivy。 此问题列出了这些 Window 提供程序中的每一个的尝试和结果。 这些提供程序列在以下页面中:

https://kivy.org/doc/stable/guide/environment.html

KIVY_WINDOW
用于创建窗口的实现
值:sdl2、pygame、x11、egl_rpi

版本

  • 蟒蛇:3.7.3
  • 操作系统:Raspbian Buster 4.19
  • 基维:1.11.1
  • Kivy 安装方法: https :

描述

下面列出的相同 test.py 程序用于测试上面列出的所有 Window 提供程序。 第二行针对每个测试结果进行更改。

import os
#os.environ['KIVY_WINDOW'] = 'egl_rpi'
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

当没有(默认)定义 KIVY_WINDOW 时(上面的 test.py),得到如下结果:

[DEBUG  ] [Window      ] Provider <egl_rpi> ignored by config
[DEBUG  ] [Window      ] Provider <sdl2> ignored by config
[DEBUG  ] [Window      ] Provider <x11> ignored by config
[CRITICAL] [Window      ] Unable to find any valuable Window provider. 
[CRITICAL] [App         ] Unable to get a Window, abort.

通过删除 # 符号更改第 2 行后,得到以下结果:

[DEBUG  ] [Window      ] Ignored <egl_rpi> (import error)
[DEBUG  ] [Window      ] Provider <sdl2> ignored by config
[DEBUG  ] [Window      ] Provider <x11> ignored by config
[CRITICAL] [Window      ] Unable to find any valuable Window provider. 
egl_rpi - ImportError: cannot import name 'bcm' from 'kivy.lib.vidcore_lite' (/usr/local/lib/python3.7/dist-packages/kivy/lib/vidcore_lite/__init__.py)
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 12, in <module>
    from kivy.lib.vidcore_lite import bcm, egl
[CRITICAL] [App         ] Unable to get a Window, abort.

将第 2 行更改为os.environ['KIVY_WINDOW'] = 'sdl2' ,得到以下结果:

[DEBUG  ] [Window      ] Provider <egl_rpi> ignored by config
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[DEBUG  ] [Window      ] Provider <x11> ignored by config
[CRITICAL] [Window      ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
sdl2 - RuntimeError: b'Could not initialize EGL'
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 71, in core_select_lib
    cls = cls()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_sdl2.py", line 152, in __init__
    super(WindowSDL, self).__init__()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/__init__.py", line 981, in __init__
    self.create_window()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_sdl2.py", line 290, in create_window
    self.get_gl_backend_name())
  File "kivy/core/window/_window_sdl2.pyx", line 224, in kivy.core.window._window_sdl2._WindowSDL2Storage.setup_window
  File "kivy/core/window/_window_sdl2.pyx", line 74, in kivy.core.window._window_sdl2._WindowSDL2Storage.die
[CRITICAL] [App         ] Unable to get a Window, abort.

将第 2 行更改为os.environ['KIVY_WINDOW'] = 'pygame' ,得到以下结果:

[DEBUG  ] [Window      ] Provider <egl_rpi> ignored by config
[DEBUG  ] [Window      ] Provider <sdl2> ignored by config
[DEBUG  ] [Window      ] Provider <x11> ignored by config
[CRITICAL] [Window      ] Unable to find any valuable Window provider. 
[CRITICAL] [App         ] Unable to get a Window, abort.

将第 2 行更改为os.environ['KIVY_WINDOW'] = 'x11' ,得到以下结果:

[DEBUG  ] [Window      ] Provider <sdl2> ignored by config
[DEBUG  ] [Window      ] Ignored <x11> (import error)
[CRITICAL] [Window      ] Unable to find any valuable Window provider. 
x11 - ModuleNotFoundError: No module named 'kivy.core.window.window_x11'
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
[CRITICAL] [App         ] Unable to get a Window, abort.

最有用的评论

以下是有关如何在 Buster lite 上启动时安装和运行 Kivy 应用程序的说明:

首先安装 xserver-org,因为我们需要它来显示实际窗口:

sudo apt-get -y install xserver-xorg

接下来我从源代码安装 nodm,因此它包括以下修复: https :

sudo apt-get -y install libpam0g-dev help2man libx11-dev debhelper
git clone https://github.com/slashblog/nodm.git
pushd nodm
    git checkout d48a8f6266d3f464138e0e95b65896917c35c89f
    source /etc/os-release  # Will set the 'VERSION' variable
    if [ "$(echo $VERSION | sed -En 's/[0-9]+ \(([a-z]+)\)/\1/p')" == "buster" ]; then
        wget http://deb.debian.org/debian/pool/main/n/nodm/nodm_0.13-5.debian.tar.xz
    else
        wget http://deb.debian.org/debian/pool/main/n/nodm/nodm_0.13-1.3.debian.tar.xz
    fi
    tar xf nodm_0.13-*.debian.tar.xz
    sudo dpkg-buildpackage -us -uc -b
popd
sudo dpkg -i nodm_0.13-*_armhf.deb
sudo rm -rf nodm*

现在启用图形登录:

sudo systemctl set-default graphical.target

配置 nodm 并在启动时启动我们的应用程序:

# Has the same effect as calling 'sudo dpkg-reconfigure nodm'
sudo sh -c 'echo "NODM_ENABLED=true" > /etc/default/nodm'
sudo sh -c 'echo "NODM_USER=$SUDO_USER" >> /etc/default/nodm' # Note that the variable SUDO_USER is used
sudo sh -c 'echo "NODM_FIRST_VT='\''7'\''" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_XSESSION=/etc/X11/Xsession" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_X_OPTIONS='\''-nolisten tcp'\''" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_MIN_SESSION_TIME=60" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_X_TIMEOUT=300" >> /etc/default/nodm'

# Start the app using nodm
echo '#!/bin/bash' > ~/.xsession
echo 'export DISPLAY=:0.0' >> ~/.xsession
echo "~/venv-kivy/bin/python3 ~/app.py" >> ~/.xsession

设置虚拟环境:

sudo apt-get -y install python3-pip python3-venv
sudo pip3 install -U pip
python3 -m venv venv-kivy
source ~/venv-kivy/bin/activate

安装 Kivy 依赖项:

sudo apt-get -y install python3-dev libmtdev1 libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
sudo apt-get -y install pkg-config libgl1-mesa-dev libgles2-mesa-dev libgstreamer1.0-dev gstreamer1.0-plugins-{bad,base,good,ugly} gstreamer1.0-{omx,alsa} libmtdev-dev
pip3 install -U pygments docutils Cython==0.29.10 wheel

现在是编译和安装 Kivy 的时候了。 请注意,我使用带有补丁的 fork,因此它不使用在 Raspberry Pi 4 上不可用的专有 Broadcom 驱动程序 (https://github.com/Lauszus/kivy/commit/9cdcada34a6149b7fd6bd4c57285afc828d69948):

export VIDEOCOREMESA=1; pip3 install git+https://github.com/Lauszus/kivy.git@rpi4_auto#egg=kivy

最后创建一个小的测试应用程序:

cat <<EOF > ~/app.py
from kivy.app import App
from kivy.uix.button import Button


class TestApp(App):

    def build(self):
        return Button(text='hello world')


if __name__ == '__main__':
    TestApp().run()
EOF

现在重新启动并享受:)

所有113条评论

在 RPi 4B: 1G 版本中发现相同的行为。 之前在其他SBC论坛看到,要使用sdl2 window provider,需要重新编译支持KMS的sdl2。 不确定这是否会有所帮助。
Tinker Board: https: //groups.google.com/forum/m/#!topic/kivy -users/jwBnYxe969g
杰森纳米:
https://devtalk.nvidia.com/default/topic/1057120/kivy-app-fails-on-jetson-nano-/

同样,我花了三天的时间进行测试,试图找到一种可行的 Raspbian Lite 配置,该配置可以在具有 4GB RAM 的 Raspberry Pi 4B 上的 SunFounder 10" 触摸屏(与标准 Raspberry Pi Foundation 显示器合理兼容)上显示 GUI。

错误条件:Kivy 应用程序崩溃(无响应)需要另一个会话的kill
错误消息:“未能添加服务 - 已在使用中?” (在随后的尝试后看到)
错误:启动后没有 GUI 输出(使用 Legacy KMS 选项时),但日志输出似乎很愉快

好吧,由于新的双微型 HDMI 端口,我已经遇到了 HDMI 无法正常工作的问题。 我还没有用 4B 型号测试过 7" 官方触摸屏,可以想象会有问题。我已经报告了 micro-HDMI 问题。祝 DSI 好运。

在尝试使用egl_rpi后端时,我在 buster full 上遇到了failed to add service - already in use? 。 通过在/boot/config.txt注释掉dtoverlay=vc4-kms-v3d来修复它使错误消失,但随后 kivy 根本没有显示任何内容。

我想知道在 buster lite 上是不是一样?

在尝试使用egl_rpi后端时,我在 buster full 上遇到了failed to add service - already in use? 。 通过在/boot/config.txt注释掉dtoverlay=vc4-kms-v3d来修复它使错误消失,但随后 kivy 根本没有显示任何内容。

我想知道在 buster lite 上是不是一样?

有同样的问题,但现在得到了。 刚刚在 raspi-config 中禁用了 openGL
x11 - 导入错误:没有名为 window_x11 的模块
文件“/home/pi/project/venv/local/lib/python2.7/site-packages/kivy/core/__init__.py”,第59行,在core_select_lib
fromlist=[modulename], level=0)
使用 raspbian buster、python2.7、virtualenv 和 kivy 1.10.1。

@Gawezi您需要通过设置KIVY_WINDOW=egl_rpi来设置 kivy 以使用 egl_rpi 窗口,而不是 x11 。 如果您确实想运行 x11,那么请确保在安装时编译支持 x11 的 kivy ( USE_X11=1 )。

在#6418 上运行 Buster 的Pi 3B上遇到相同/类似的问题感谢您发布您的进度,我真的希望解决方案快点出现!

@matham你能详细说明在哪里设置 USE_X11=1 吗? 我认为这是我对 Buster 和 ALARM 的问题(没有在没有桌面的情况下从控制台启动测试过同样的问题)。 我一直在尝试在没有桌面的情况下运行 kivy 并认为这是我的问题。 我需要像你说的那样编译支持 x11 的 kivy。

@frankgould在编译 kivy 之前导出 VIDEOCOREMESA=1 环境变量(https://github.com/kivy/kivy/commit/fa9932d812afd74f8524d17f5a85365e64ac39d7)

否则,它将始终针对 rpi 上的专有驱动程序进行编译。
此外,您必须安装 x11 并启动一个会话并在 x11 会话中启动 kivy 应用程序。
您可以使用像 i3wm 这样的最小窗口管理器,使事情变得更简单。

@rnixx感谢您提供信息。 我今天要试一试。

USE_X11=1编译kivy时需要在环境中。

但是,这不太可能解决您在没有桌面的情况下运行 kivy 的问题,因为如果您在没有桌面的情况下运行,我猜您在操作系统中没有 x 支持的情况下运行,因此在 kivy 中拥有 x 支持将无济于事。

只有 egl_rpi 应该在没有 x 支持的情况下工作 afaik。

谢谢@matham。 我在 /etc/environment 中添加了 key=Val 组合以及 KIVY_GRAPHICS=“gles”和 VIDEOCOREMESA=1,但没有桌面就没有任何工作。 它打不开窗户。 我需要深入研究一个旧的 RPi3A+,看看我是如何安装它的,让它在没有桌面的情况下在 ALARM 上运行。

更新:以上测试是在 ALARM 4.19 上进行的,而不是 Buster。 因此,此评论不在此线程之外,但具有相关性。 接下来我将在 Buster 上对此进行测试。

今天我测试了安装了以下 /etc/environment 内容的 RPi4B:4GB Raspbian 4.19 kivy:

USE_X11=1
VIDEOCOREMESA=1
KIVY_GRAPHICS="gles"

以下是使用默认环境值运行的结果:

pi<strong i="9">@SlideShowPi</strong>:~/SlideShow $ python3 test.py
[INFO   ] [Logger      ] Record log in /home/pi/.masterpics/logs/SlideShowPi_19-08-23_15.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.7/dist-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.2.0]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3"
[INFO   ] [Factory     ] 184 symbols loaded
[DEBUG  ] [Cache       ] register <kv.lang> with limit=None, timeout=None
[DEBUG  ] [Cache       ] register <kv.image> with limit=None, timeout=60
[DEBUG  ] [Cache       ] register <kv.atlas> with limit=None, timeout=None
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[DEBUG  ] [Cache       ] register <kv.texture> with limit=1000, timeout=60
[DEBUG  ] [Cache       ] register <kv.shader> with limit=1000, timeout=3600
[DEBUG  ] [Text        ] Provider <pango> ignored by config
[INFO   ] [Text        ] Provider: sdl2(['text_pango'] ignored)
[DEBUG  ] [App         ] Loading kv <./test.kv>
[DEBUG  ] [App         ] kv <./test.kv> not found
[DEBUG  ] [Window      ] Ignored <egl_rpi> (import error)
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[DEBUG  ] [Window      ] Ignored <x11> (import error)
[CRITICAL] [Window      ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
egl_rpi - ImportError: cannot import name 'bcm' from 'kivy.lib.vidcore_lite' (/usr/local/lib/python3.7/dist-packages/kivy/lib/vidcore_lite/__init__.py)
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 12, in <module>
    from kivy.lib.vidcore_lite import bcm, egl

sdl2 - RuntimeError: b'Could not initialize EGL'
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 71, in core_select_lib
    cls = cls()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_sdl2.py", line 152, in __init__
    super(WindowSDL, self).__init__()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/__init__.py", line 981, in __init__
    self.create_window()
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/window/window_sdl2.py", line 290, in create_window
    self.get_gl_backend_name())
  File "kivy/core/window/_window_sdl2.pyx", line 224, in kivy.core.window._window_sdl2._WindowSDL2Storage.setup_window
  File "kivy/core/window/_window_sdl2.pyx", line 74, in kivy.core.window._window_sdl2._WindowSDL2Storage.die

x11 - ModuleNotFoundError: No module named 'kivy.core.window.window_x11'
  File "/usr/local/lib/python3.7/dist-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)

[CRITICAL] [App         ] Unable to get a Window, abort.
  • 树莓派 4B 4GB
  • Raspbian Buster Lite 7-10-2019
  • 基维 1.11.1
  • 蟒蛇 3.7.3
  • SunFounder 10.1" 电容式 TFT 显示屏

我在我的装备上收到了segmentation fault

gdb --args python3 test.py # then press 'r' to run it

GNU gdb (Raspbian 8.2.1-2) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python3...(no debugging symbols found)...done.
(gdb) r

Starting program: /usr/bin/python3 test.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
[INFO   ] [Logger      ] Record log in /home/pi/.kivy/logs/kivy_19-08-23_16.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.7/dist-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.2.0]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3"
[Detaching after fork from child process 3301]
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2(['text_pango'] ignored)
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[New Thread 0xb4171460 (LWP 3302)]
[New Thread 0xb37ff460 (LWP 3303)]
[New Thread 0xb2ffe460 (LWP 3304)]
[New Thread 0xb27fd460 (LWP 3305)]
[INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
[INFO   ] [GL          ] Backend used <gl>

Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
0xb6fbc1dc in strlen () from /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so

我想我找到了在 RPi3A+ 上构建 Arch Linux 的解决方案。 下面是启动在自动登录和我的启动屏幕 systemd 服务时执行的内容,也在下面。 因此,看起来启动启动 X11,这就是 kivy 启动的方式(在pastebin 上)。 我需要在 Buster 上测试这个,看看我是否得到相同的结果。

.xinitrc 内容:

#!/bin/sh
# ~/.xinitrc
# Executed by startx (run your window manager from here)
if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

exec startlxde

我的屏幕启动服务:

[Unit]
Description=Remote Control Screen
Requires=time-sync.target
After=time-sync.target

[Service]
Environment="DISPLAY=:0.0"
ExecStart=/usr/bin/python3 /home/remote/app/main.py
RemainAfterExit=yes
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

启动时的 kivy 环境值:

#! /usr/bin/python3
import os
os.environ['KIVY_VIDEO']='ffpyplayer'

这在带有 Pi3B+ 的 Buster 上双向运行
但是对于 Pi4,我发现了一些我应该调查的事情。 但那是在星期一@OutsourcedGuru ?!

实际上,我星期六在这里测试这些废话。

与上述相同的 Raspbian Lite 装备,并尝试添加 x11 接口。 我试图只获得最低限度,但这不会调出 GUI 桌面。 从 Pi 本身启动它并启动 x 然后如下所示工作。

sudo apt-get install --no-install-recommends xserver-xorg # Trying for the PIXEL desktop
sudo apt-get install --no-install-recommends xinit # Need the startx script
sudo pip3 install --force-reinstall kivy
python3 test.py # Didn't work - segmentation fault
startx # Didn't work - wouldn't start the desktop
sudo apt-get install --yes raspberrypi-ui-mods # Desktop
python3 test.py # Didn't work - segmentation fault
startx # Worked - then open a terminal from the upper menu
python3 test.py # Works - displays a window

相同的 Raspbian Lite 装备(添加了 x11/Desktop)在 Python2 世界中仍然受到影响。 它冻结,不响应 Ctl-C,不显示另一个窗口,否则正常记录。

@OutsourcedGuru您应该从一开始就忽略使用python2 。 它的支持在今年结束。
所以你应该做的是只安装python3并且只使用pip3 。 我不知道为什么Raspbian没有将 python3 设为默认 python。 如果您跟进Arch Linux您就会知道python3是完美的默认版本。

然而,自 1 月以来,我一直在为OctoPrint开发一个插件。 它尚不支持master分支上的 Py3。 我刚刚花了一个上午的时间在他们的devel分支上安装一些东西来测试这个。 我可能会花几天的时间来修改我的插件,以便让它在一些甚至没有推送到可行平台的东西上工作。 然后我可以交叉手指并希望他们正在开发的代码不会破坏我自己的东西。 (这是用于生产打印机的产品,在这种情况下,测试版代码通常不是您喜欢的。)

“唉,可怜的约里克,我很了解他。”

@OutsourcedGuru ,我曾经读过一位 Raspberry Pi 版主说,没有人应该将商业模式建立在 Raspbian 或 Raspberry Pi 上。 他当时可能是对的,但随着时间的推移,他们为更多的可能性取得了进步。 正如您在上面看到的,我的应用程序可以使用 ALARM; 然而,从那时起,HDMI 音频就被灌输了。 它在 python 命令行中很干净,但是从 systemd 运行时,它是垃圾。

因此,这是开发人员追逐的技术曲线。 你可以像我今天一样整天敲打它,但仍然没有结果。 只要继续冲击,如果这对你来说是值得的。

有人尝试过这个建议吗? 看起来他也在改变 KIVY_TEXT。 如果有机会,我会在这个周末尝试。

https://stackoverflow.com/questions/56947840/kivy-1-10-1-and-1-11-0-not-working-on-raspberry-pi4-buster

所以每个人仍然无法让 Kivy 在 Buster 上运行..?

在桌面版本上运行 Kivy 程序很容易,但仍然没有找到一种方法让我自己在控制台启动中启动它。

还有谁?

谢谢哈哈,我觉得现在不尝试很愚蠢......我只是通过 ssh 尝试过,但只是通过 vnc 试了一下,它确实有效。 如果有任何兴趣,tkinter(其他 python UI 库)也不能通过控制台工作,但可以在桌面上工作。

我确实需要一种可靠的方式从控制台启动或至少启动,但感谢您提到这一点,我终于有了解决方法!

@masynthetic在警报上,我的 .xinitrc 启动窗口,然后我的 Kivy 应用程序在窗口启动后自动运行。 如果您需要,我可以提供更多信息。 我现在不在办公室,需要启动平板电脑才能确切了解我是如何实现它的。

这将非常有帮助,谢谢,不要着急,因为我主要只需要一个
此时的开发环境

2019 年 9 月 14 日星期六,凌晨 3:17,Frank Gould [email protected]写道:

@masynthetic https://github.com/masynthetic在警报上,我的 .xinitrc
启动 windows 然后我的 Kivy 应用程序在 windows 启动后自动运行。 我能给
如果您需要更多信息。 我现在不在办公室,需要开机
平板电脑,看看我是如何实现它的。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/kivy/kivy/issues/6474?email_source=notifications&email_token=AEOWUVKTRWPPLKDVSMG2ERDQJS25HA5CNFSM4IL7DFSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN6issueDWY500000000000M
或静音线程
https://github.com/notifications/unsubscribe-auth/AEOWUVMTOIQUCNBD7EKOK3TQJS25HANCNFSM4IL7DFSA
.

那会很有用。 @弗兰古尔德

我确实认为我们需要一个很好的解决方案来解决这个无桌面版本的问题。 我希望稍后再回到这里,底层操作系统和驱动程序集像以前一样工作。 虽然愤世嫉俗,但我有点怀疑。

我也从来没有让 kivy 在没有补丁的情况下在 debian Jessie 上工作。 但是,如果您可以使用 egl,那么我发现过去在kivy/core/window/window_egl_rpi.py修补初始化程序很有用,方法是替换:

-    def create_window(self):
+    def create_window(self, *args):

几个月前,我在旧版本的 kivy 上遇到了类似的问题,这解决了问题。

如果我没记错的话,默认情况下使用 egl 创建窗口会失败,因为传递了额外的参数。 异常在某处被捕获,并被忽略。

在 Debian Jessie 上,这个补丁为我解决了所有问题,但我没有在 Buster 上测试过。

由于此提交,仍然可能忽略 egl 选项:333a4cc9c7b4b3168f7427d27f4fdea2a69bc52b。

无论如何,嗯。

@ahendriksen假设是一个虚拟环境,是直接修补文件还是修补后需要重新安装? (谢谢。)

你可以就地做,但我怀疑这是这里的问题,因为我没有在 buster 问题中发布的任何回溯中看到这一点。 但是,如果有一个回溯显示这个错误,发布它会很有帮助,所以我们可以修复它。

@OutsourcedGuru根据我的经验,就地修补应该有效。

@matham ,我刚刚在树莓

我可以报告说,在带有 Buster 的 Pi 3 Model B+ 上,当前的主分支 (2.0.0-dev0) 工作正常。
不需要修补 window_egl_rpi.pi。

它似乎对我不起作用,因为它的价值。 我放弃了这一点,并在 Buster 桌面上度过了一天,并尝试了 Python 3。

到目前为止,在 Raspberry Pi 4 上的 Buster Lite 上没有 Kivy 的解决方案,对吧?
树莓派4 4GB
Rpi官方显示
树莓派克星 2019-09-26
蟒蛇:3.7.3
Kivy:v2.0.0.dev0

启动后第一次运行一个简单的 Kivy 文件时,我有以下日志但没有屏幕
[INFO ] [Logger ] 在 /home/pi/.kivy/logs/kivy_19-10-02_7.txt 中记录日志
[信息] [Kivy] v2.0.0.dev0, git-f223133, 20191002
[信息] [Kivy] 安装在“/usr/local/lib/python3.7/dist-packages/kivy/__init__.py”
[信息] [Python] v3.7.3(默认,2019 年 4 月 3 日,05:39:12)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[信息] [工厂] 184 个符号已加载
[调试] [缓存] 寄存器限制=无,超时=无
[调试] [缓存] 寄存器限制=无,超时=60
[调试] [缓存] 寄存器限制=无,超时=无
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[调试] [缓存] 寄存器限制=1000,超时=60
[调试] [缓存] 寄存器限制=1000,超时=3600
[调试] [应用] 加载 kv <./test.kv>
[信息] [文本] 提供者:sdl2
[信息] [窗口] 提供者:egl_rpi
[调试] [窗口] 实际显示尺寸:800x480
[信息] [GL] 使用“OpenGL ES 2”图形系统
[DEBUG] [GL] glShaderBinary 不可用
[信息] [GL] 使用的后端
[信息] [GL] OpenGL 版本 [信息] [GL] OpenGL 供应商 [信息] [GL] OpenGL 渲染器
[信息] [GL] OpenGL 解析版本:2, 0
[信息] [GL] 着色版本
[信息] [GL] 纹理最大尺寸 <2048>
[INFO] [GL] 纹理最大单位 <8>
[DEBUG] [Shader] Fragment 编译成功
[DEBUG] [Shader] 顶点编译成功
[调试] [ImageSDL2] 加载
[INFO] [Window] 不允许使用虚拟键盘,单模式,未停靠
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Base] 从鼠标创建提供程序
[DEBUG] [Base] 从probesysfs,provider=mtdev 创建提供者
[调试] [ProbeSysfs ] 使用probesysfs!
[DEBUG] [ProbeSysfs] 在 /dev/input/event0 找到设备:基于 FT5406 内存的驱动程序
[信息] [ProbeSysfs] 设备匹配:/dev/input/event0
[INFO] [MTD] 从中读取事件
[DEBUG] [Base] 从probesysfs,provider=hidinput 创建提供者
[调试] [ProbeSysfs ] 使用probesysfs!
[DEBUG] [ProbeSysfs] 在 /dev/input/event0 找到设备:基于 FT5406 内存的驱动程序
[信息] [ProbeSysfs] 设备匹配:/dev/input/event0
[INFO] [HIDInput] 从中读取事件
[INFO] [Base] 启动应用程序主循环
[INFO] [MTD] 范围位置 X 为 0 - 800
[INFO] [MTD] 范围位置 Y 为 0 - 480
[INFO] [MTD] 范围触摸主要是 0 - 0
[INFO] [MTD] 范围接触次要为 0 - 0
[信息] [MTD] 范围压力为 0 - 255
[INFO] [MTD] 轴反转:X 为 0,Y 为 0
[信息] [MTD] 旋转设置为 0
[信息] [HIDMotionEvent] 使用
[INFO] [GL] NPOT 纹理支持可用
[信息] [HIDMotionEvent] 范围 ABS X 位置为 0 - 800
[信息] [HIDMotionEvent] 范围 ABS Y 位置为 0 - 480
[信息] [HIDMotionEvent] 范围位置 X 为 0 - 800
[信息] [HIDMotionEvent] 范围位置 Y 是 0 - 480
[调试] [地图集] 加载
[DEBUG] [Atlas] 需要加载1张图片
[调试] [地图集] 加载
[调试] [ImageSDL2] 加载

第二次我没有屏幕,但我的日志更小:
[INFO] [Logger] 在 /home/pi/.kivy/logs/kivy_19-10-02_8.txt 中记录日志
[信息] [Kivy] v2.0.0.dev0, git-f223133, 20191002
[信息] [Kivy] 安装在“/usr/local/lib/python3.7/dist-packages/kivy/__init__.py”
[信息] [Python] v3.7.3(默认,2019 年 4 月 3 日,05:39:12)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[信息] [工厂] 184 个符号已加载
[调试] [缓存] 寄存器限制=无,超时=无
[调试] [缓存] 寄存器限制=无,超时=60
[调试] [缓存] 寄存器限制=无,超时=无
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[调试] [缓存] 寄存器限制=1000,超时=60
[调试] [缓存] 寄存器限制=1000,超时=3600
[调试] [应用] 加载 kv <./test.kv>
[信息] [文本] 提供者:sdl2
[信息] [窗口] 提供者:egl_rpi
[调试] [窗口] 实际显示尺寸:800x480

有没有人设法让它工作?

同样的 SD 卡在 RPi3B+ 上运行良好。 这些日志来自 RPI4 4GB。

我无法在无桌面的 Raspbian Buster 上进行任何操作。 这可能是由于 Raspbian 驱动程序堆栈中的 OpenGL ES v3 接口(而不是预期的 v2)。 或者由于双 HDMI 适配器而有些奇怪。

到目前为止,在 Raspberry Pi 4 上的 Buster Lite 上没有 Kivy 的解决方案,对吧?
树莓派4 4GB
Rpi官方显示
树莓派克星 2019-09-26
蟒蛇:3.7.3
Kivy:v2.0.0.dev0

启动后第一次运行一个简单的 Kivy 文件时,我有以下日志但没有屏幕
[INFO ] [Logger ] 在 /home/pi/.kivy/logs/kivy_19-10-02_7.txt 中记录日志
[信息] [Kivy] v2.0.0.dev0, git-f223133, 20191002
[INFO] [Kivy]安装在“/usr/local/lib/python3.7/dist-packages/kivy/ INIT py”为
[信息] [Python] v3.7.3(默认,2019 年 4 月 3 日,05:39:12)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[信息] [工厂] 184 个符号已加载
[调试] [缓存] 寄存器限制=无,超时=无
[调试] [缓存] 寄存器限制=无,超时=60
[调试] [缓存] 寄存器限制=无,超时=无
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[调试] [缓存] 寄存器限制=1000,超时=60
[调试] [缓存] 寄存器限制=1000,超时=3600
[调试] [应用] 加载 kv <./test.kv>
[信息] [文本] 提供者:sdl2
[信息] [窗口] 提供者:egl_rpi
[调试] [窗口] 实际显示尺寸:800x480
[信息] [GL] 使用“OpenGL ES 2”图形系统
[DEBUG] [GL] glShaderBinary 不可用
[信息] [GL] 使用的后端
[信息] [GL] OpenGL 版本 [信息] [GL] OpenGL 供应商 [信息] [GL] OpenGL 渲染器
[信息] [GL] OpenGL 解析版本:2, 0
[信息] [GL] 着色版本
[信息] [GL] 纹理最大尺寸 <2048>
[INFO] [GL] 纹理最大单位 <8>
[DEBUG] [Shader] Fragment 编译成功
[DEBUG] [Shader] 顶点编译成功
[调试] [ImageSDL2] 加载
[INFO] [Window] 不允许使用虚拟键盘,单模式,未停靠
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Resource] 添加到路径列表中
[DEBUG] [Base] 从鼠标创建提供程序
[DEBUG] [Base] 从probesysfs,provider=mtdev 创建提供者
[调试] [ProbeSysfs ] 使用probesysfs!
[DEBUG] [ProbeSysfs] 在 /dev/input/event0 找到设备:基于 FT5406 内存的驱动程序
[信息] [ProbeSysfs] 设备匹配:/dev/input/event0
[INFO] [MTD] 从中读取事件
[DEBUG] [Base] 从probesysfs,provider=hidinput 创建提供者
[调试] [ProbeSysfs ] 使用probesysfs!
[DEBUG] [ProbeSysfs] 在 /dev/input/event0 找到设备:基于 FT5406 内存的驱动程序
[信息] [ProbeSysfs] 设备匹配:/dev/input/event0
[INFO] [HIDInput] 从中读取事件
[INFO] [Base] 启动应用程序主循环
[INFO] [MTD] 范围位置 X 为 0 - 800
[INFO] [MTD] 范围位置 Y 为 0 - 480
[INFO] [MTD] 范围触摸主要是 0 - 0
[INFO] [MTD] 范围接触次要为 0 - 0
[信息] [MTD] 范围压力为 0 - 255
[INFO] [MTD] 轴反转:X 为 0,Y 为 0
[信息] [MTD] 旋转设置为 0
[信息] [HIDMotionEvent] 使用
[INFO] [GL] NPOT 纹理支持可用
[INFO] [HIDMotionEvent] 范围 ABS X 位置为 0 - 800
[INFO] [HIDMotionEvent] 范围 ABS Y 位置为 0 - 480
[INFO] [HIDMotionEvent] 范围位置 X 为 0 - 800
[INFO] [HIDMotionEvent] 范围位置 Y 为 0 - 480
[调试] [地图集] 加载
[DEBUG] [Atlas] 需要加载1张图片
[调试] [地图集] 加载
[调试] [ImageSDL2] 加载

第二次我没有屏幕,但我的日志更小:
[INFO] [Logger] 在 /home/pi/.kivy/logs/kivy_19-10-02_8.txt 中记录日志
[信息] [Kivy] v2.0.0.dev0, git-f223133, 20191002
[INFO] [Kivy]安装在“/usr/local/lib/python3.7/dist-packages/kivy/ INIT py”为
[信息] [Python] v3.7.3(默认,2019 年 4 月 3 日,05:39:12)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[信息] [工厂] 184 个符号已加载
[调试] [缓存] 寄存器限制=无,超时=无
[调试] [缓存] 寄存器限制=无,超时=60
[调试] [缓存] 寄存器限制=无,超时=无
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[调试] [缓存] 寄存器限制=1000,超时=60
[调试] [缓存] 寄存器限制=1000,超时=3600
[调试] [应用] 加载 kv <./test.kv>
[信息] [文本] 提供者:sdl2
[信息] [窗口] 提供者:egl_rpi
[调试] [窗口] 实际显示尺寸:800x480

有没有人设法让它工作?

同样的 SD 卡在 RPi3B+ 上运行良好。 这些日志来自 RPI4 4GB。

到目前为止,不可能在无桌面的 RPi4 中运行任何 kivy 应用程序。 这是驱动程序故障,因此我们必须等待下一个 kivy 版本(或主版本)中的某个补丁。

[INFO ] [Window ] Provider: egl_rpi

我真的不认为你会让 Kivy(任何版本)与egl_rpi Window 提供者交谈,因为 Kivy 与gles2.h而不是一些名为gles3.h独角兽相关联从我所看到的情况来看,这是不存在的。 Pi4B 使用 OpenGL ES v3。

尝试调整配置,以便 Kivy 要求sdl2或其他东西。 在这里通读弗兰克的帖子。

有没有办法在 Pi 上安装Google Angle 代码(也许是为了获取 OpenGL ES 3.0 头文件),然后修补 Kivy egl_rpi 提供程序以引入 gles3.h 而不是 gles2.h(或类似的)?

以下是有关如何在 Buster lite 上启动时安装和运行 Kivy 应用程序的说明:

首先安装 xserver-org,因为我们需要它来显示实际窗口:

sudo apt-get -y install xserver-xorg

接下来我从源代码安装 nodm,因此它包括以下修复: https :

sudo apt-get -y install libpam0g-dev help2man libx11-dev debhelper
git clone https://github.com/slashblog/nodm.git
pushd nodm
    git checkout d48a8f6266d3f464138e0e95b65896917c35c89f
    source /etc/os-release  # Will set the 'VERSION' variable
    if [ "$(echo $VERSION | sed -En 's/[0-9]+ \(([a-z]+)\)/\1/p')" == "buster" ]; then
        wget http://deb.debian.org/debian/pool/main/n/nodm/nodm_0.13-5.debian.tar.xz
    else
        wget http://deb.debian.org/debian/pool/main/n/nodm/nodm_0.13-1.3.debian.tar.xz
    fi
    tar xf nodm_0.13-*.debian.tar.xz
    sudo dpkg-buildpackage -us -uc -b
popd
sudo dpkg -i nodm_0.13-*_armhf.deb
sudo rm -rf nodm*

现在启用图形登录:

sudo systemctl set-default graphical.target

配置 nodm 并在启动时启动我们的应用程序:

# Has the same effect as calling 'sudo dpkg-reconfigure nodm'
sudo sh -c 'echo "NODM_ENABLED=true" > /etc/default/nodm'
sudo sh -c 'echo "NODM_USER=$SUDO_USER" >> /etc/default/nodm' # Note that the variable SUDO_USER is used
sudo sh -c 'echo "NODM_FIRST_VT='\''7'\''" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_XSESSION=/etc/X11/Xsession" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_X_OPTIONS='\''-nolisten tcp'\''" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_MIN_SESSION_TIME=60" >> /etc/default/nodm'
sudo sh -c 'echo "NODM_X_TIMEOUT=300" >> /etc/default/nodm'

# Start the app using nodm
echo '#!/bin/bash' > ~/.xsession
echo 'export DISPLAY=:0.0' >> ~/.xsession
echo "~/venv-kivy/bin/python3 ~/app.py" >> ~/.xsession

设置虚拟环境:

sudo apt-get -y install python3-pip python3-venv
sudo pip3 install -U pip
python3 -m venv venv-kivy
source ~/venv-kivy/bin/activate

安装 Kivy 依赖项:

sudo apt-get -y install python3-dev libmtdev1 libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
sudo apt-get -y install pkg-config libgl1-mesa-dev libgles2-mesa-dev libgstreamer1.0-dev gstreamer1.0-plugins-{bad,base,good,ugly} gstreamer1.0-{omx,alsa} libmtdev-dev
pip3 install -U pygments docutils Cython==0.29.10 wheel

现在是编译和安装 Kivy 的时候了。 请注意,我使用带有补丁的 fork,因此它不使用在 Raspberry Pi 4 上不可用的专有 Broadcom 驱动程序 (https://github.com/Lauszus/kivy/commit/9cdcada34a6149b7fd6bd4c57285afc828d69948):

export VIDEOCOREMESA=1; pip3 install git+https://github.com/Lauszus/kivy.git@rpi4_auto#egg=kivy

最后创建一个小的测试应用程序:

cat <<EOF > ~/app.py
from kivy.app import App
from kivy.uix.button import Button


class TestApp(App):

    def build(self):
        return Button(text='hello world')


if __name__ == '__main__':
    TestApp().run()
EOF

现在重新启动并享受:)

需要使用 Raspbian Buster 完整版的 RPi4B 安装说明

测试:

树莓派4 4GB
7' HDMI 显示器(由靠近 type-C 的一个 micro hdmi 工作)
配置文件

max_usb_current=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
hdmi_drive=1

树莓派克星 2019-09-26 完整版

日志:错误“* 添加服务失败 - 已在使用中?”

pi@ raspberrypi :~/kivy-examples/3Drendering $ python main.py
[INFO] [Logger] 在 /home/pi/.kivy/logs/kivy_19-10-19_10.txt 中记录日志
[信息] [Kivy] v1.11.0
[信息] [Kivy] 安装在“/usr/local/lib/python2.7/dist-packages/kivy/__init__.pyc”
[信息] [Python] v2.7.16(默认,2019 年 4 月 6 日,01:42:57)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[警告] [已弃用] Python 2 Kivy 支持已被弃用。 1.11.0 之后的 Kivy 版本将不再支持 Python 2
[信息] [工厂] 184 个符号已加载
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[信息] [窗口] 提供者:egl_rpi

  • 添加服务失败 - 已在使用?

@Lauszus我会在这个周末的某个时候测试一下。 感谢您对此的帮助。 :)

@diamond2nv “...Raspbian Buster 已满”如果您的意思是 Raspbian Buster _Desktop_,那么说明在此处的 Kivy 问题中。

非常感谢 !
该指令解决了问题。

附注。 “2019-09-26-raspbian-buster-full.img”

@Lauszus好的,我已经在...

  • 树莓派 4B (4GB)
  • elo 10.1" 电容式触摸屏
  • Raspbian Buster Lite 9/26/2019 ->“Linux octopi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l”
  • sudo apt-get update && sudo apt-get -y upgrade开始
  • sudo raspi-config与本地化,自动启动到 CLI _and 对于我的安装,接口更改(I2C/UART/相机)_

我注意到我通过执行 Raspbian 恢复过程来准备所有这些,因为我早些时候运行rpi-update以尝试使这项工作正常进行。 众所周知,这会更改存储在芯片上的固件,因此我恢复到已发布的版本。

否则,我按照您的指示进行操作。 此外,我更新了配置以允许触摸屏设备工作。

编辑为~/.kivy/config.ini

[input]
mouse = mouse
#%(name)s = probesysfs,provider=hidinput
mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinput

修复全屏

它没有出现“全屏”,所以我想我需要稍微调整一下设置。 它可能是 800x640 而不是预期的 1280x800。 这可能在 Raspbian /boot/config.txt 、Kivy ~/.kivy/config.ini文件或 xsession 配置中...

不过,凭直觉,我只是通过在顶部附近包含以下内容来调整测试应用程序:

from kivy.core.window import Window
Window.fullscreen = True

正如预期的那样,这似乎可以将应用程序调整为全屏显示。

非常感谢! 我很想知道什么时候将其引入 Kivy 本身的master分支。

@OutsourcedGuru请看我打开的 PR: https :

如果您可以尝试使用VIDEOCOREMESA=0VIDEOCOREMESA=1并查看是否有任何性能差异,那就太好了。

@Lauszus :干得好 - 工作得很好。

还有@OutsourcedGuru。

@Lauszus我早些时候去重新测试,但我以为你删除了那个分支......(?)所以我不能。

@OutsourcedGuru正如我之前写的那样。 我最终打开了一个新的,当它在 Raspberry Pi 4 中运行时会自动检测。无论如何,我还找到了一种交叉编译轮子的方法,因此用户不必自己编译 Kivy。 请在此处下载轮子: https : https :

@Lauszus感谢您的帮助,我使用您的 nodm 方法从 RPI3B+ 获得了一个在 RPI4 上运行的旧应用程序。
它在启动时自动启动,很棒,这就是我计划使用它的方式。
但是我在应用程序方面遇到了一些其他问题需要调试,而且我现在不确定如何从它获得正常输出,就像我从 cli 启动应用程序时一样,就像在“python3 app.py”中一样。
您对我如何实现这一目标有什么建议吗?
真的很感激。
再次非常感谢,如果没有你的帖子,我不会走到这一步。
干杯!

@lucasnzone我只是使用记录器功能而不是打印语句: https : //kivy.org/doc/stable/api-kivy.logger.html

然后我使用以下脚本重新启动 Kivy 并跟踪日志:

#!/bin/bash -e

if [[ $* == *--restart* ]]; then
    sudo service nodm restart
    inotifywait -q ~/.kivy/logs -e create --format %w%f | xargs tail -f
else
    ls -t -d ~/.kivy/logs/* | head -n1 | xargs tail -f
fi

我还没有能够测试这个,抱歉延迟。 FormNext 大约需要两周时间,所以我们在这里争先恐后地了解它的价值。

从我之前的测试中回忆起,小的 Kivy 测试程序可以运行,但是使用 Kivy 的 OctoPrint 插件似乎并不满意。 我花了相当多的时间试图改变 OctoPrint 加载的方式(以允许nodm控制该服务)。 OctoPrint 插件需要在虚拟环境中加载,并且通常作为服务发生。 我没有时间把那只兔子追到洞底。

@Lauszus 非常感谢你,我没想到,我会试一试。
再次感谢老哥

Frabjous 天。 我已经设法获得了以下工作平台:

  • Kivy 1.10.1 安装在虚拟环境中
  • 蟒蛇 2.7
  • 树莓派克星精简版
  • OctoPrint 1.3.12(来自 OctoPi 0.17.0 IMG)
  • ffpyplayer (由于 Pi4B 不兼容,不得不恢复到 gstplayer)
  • 节点
  • 使用 Kivy 的 OctoPrint 插件

它在启动和重新启动时成功地显示了一个全屏 GUI。

从 Python 代码...

    if pi_type == '4B':
        os.environ['VIDEOCOREMESA'] =       '1'
        os.environ['KIVY_WINDOW'] =         'sdl2'
        os.environ['KIVY_GL_BACKEND'] =     'gl'
        os.environ['rpi'] =                 '0'
        from kivy.core.window               import Window
        Window.fullscreen =                 True

config.ini 需要包括屏幕尺寸以及针对 TFT 屏幕的输入设备进行调整。

需要使用 Raspbian Buster 完整版的 RPi4B 安装说明

测试:

树莓派4 4GB
7' HDMI 显示器(由靠近 type-C 的一个 micro hdmi 工作)
配置文件

max_usb_current=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
hdmi_drive=1

树莓派克星 2019-09-26 完整版

日志:错误“* 添加服务失败 - 已在使用中?”

pi@ raspberrypi :~/kivy-examples/3Drendering $ python main.py
[INFO] [Logger] 在 /home/pi/.kivy/logs/kivy_19-10-19_10.txt 中记录日志
[信息] [Kivy] v1.11.0
[INFO] [Kivy]安装在“/usr/local/lib/python2.7/dist-packages/kivy/ INIT pyc文件”
[信息] [Python] v2.7.16(默认,2019 年 4 月 6 日,01:42:57)
[海湾合作委员会 8.2.0]
[信息] [Python] 在“/usr/bin/python”的解释器
[警告] [已弃用] Python 2 Kivy 支持已被弃用。 1.11.0 之后的 Kivy 版本将不再支持 Python 2
[信息] [工厂] 184 个符号已加载
[INFO] [Image] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer 被忽略)
[信息] [窗口] 提供者:egl_rpi

  • 添加服务失败 - 已在使用?

@diamond2nv ,你可以从 CLI 运行 kivy 了吗?

@elisandrom请看我的评论: https :

@elisandrom请看我的评论: #6474(评论)

谢谢 !!!!!! 完美运行!!!

对于任何有兴趣的人,可以在这里下载交叉编译的轮子: https :

只需按照以下有关如何安装所有依赖项的说明进行操作: https :

pip install Kivy-2.0.0.dev0-cp37-cp37m-linux_armv7l.whl

如果我们可以让几个人来测试这个,那就太好了,这样 #6568 就可以合并了。

@Lauszus我们可以确认那个轮子上的 Kivy 版本吗? 我必须假设它是轮子标题中的 2.0.0.dev0。 我真的不确定这里面有什么。 不过,我认为虚拟环境需要 Python 3。

@OutsourcedGuru是的,这是正确的。 它基本上只是在#6568 中提交的主分支。 这是构建它的操作: https :

是的,它需要 Python 3.7,因为这是 Buster 的标准。 您可以在全局或虚拟环境中安装它,这取决于您。

值得一提的是,我已经在 Raspbian Lite 上将我的生产平台升级到Python 3 + Kivy 1.11.1 ,安装了nodm和有限的 x windows 支持,如下所示。 它在 Pi 4B 上按预期工作。 在虚拟环境中安装只是pip install kivy==1.11.1

sudo apt-get -y install xserver-xorg libpam0g-dev help2man libx11-dev debhelper

鉴于https://github.com/kivy/kivy/issues/6474#issuecomment -542679712,目前看来 Raspberry Pi 4 的唯一解决方案是使用 X11。 是否不再像以前的 RPis 那样支持非 X 帧缓冲区? 我正在尝试将我的项目从 Raspberry Pi 3B+ 升级到 Raspberry Pi 4,但我不想为了能够显示内容而开始安装 X11。

@whitelynx我尝试在 Raspberry Pi 4 上编译没有 X 的 SDL2。但是它一直抱怨找不到窗口: https :

这是一个代码示例,它在没有 X 的 rpi4 上创建一个 opengles 窗口。
https://github.com/matusnovak/rpi-opengl-without-x/blob/master/triangle_rpi4.c
https://www.raspberrypi.org/forums/viewtopic.php?t=243707#p1499181
是否可以使用一些类似的代码来绘制 kivy 窗口?

请注意,第一个示例引入了 gl2.h。 据我所知,Pi4B 使用 gl3。

我在我的 rpi4b 上测试了它们,它们都没有问题。 第一个示例写入原始文件,您可以通过取消注释第 384 行来查看屏幕上的三角形。

@Lauszus使用不带 X11 的 SDL2 运行时无法找到窗口的问题是因为 SDL2 创建窗口代码为窗口指定了 8 个 alpha 位。 如果在 kivy.core.window._window_sdl2.pyx 中将其更改为 0 alpha 位,则它会起作用。

@ddimensia我试过改变
138: SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8)

138: SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0)
但是在尝试创建窗口时我仍然遇到相同的错误:
[CRITICAL] [Window ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes sdl2 - RuntimeError: Could not initialize EGL File "/usr/local/lib/python2.7/dist-packages/Kivy-1.11.0-py2.7-linux-armv7l.egg/kivy/core/__init__.py", line 71, in core_select_lib cls = cls() File "/usr/local/lib/python2.7/dist-packages/Kivy-1.11.0-py2.7-linux-armv7l.egg/kivy/core/window/window_sdl2.py", line 152, in __init__ super(WindowSDL, self).__init__() File "/usr/local/lib/python2.7/dist-packages/Kivy-1.11.0-py2.7-linux-armv7l.egg/kivy/core/window/__init__.py", line 969, in __init__ self.create_window() File "/usr/local/lib/python2.7/dist-packages/Kivy-1.11.0-py2.7-linux-armv7l.egg/kivy/core/window/window_sdl2.py", line 289, in create_window self.fullscreen, resizable, state) File "kivy/core/window/_window_sdl2.pyx", line 225, in kivy.core.window._window_sdl2._WindowSDL2Storage.setup_window File "kivy/core/window/_window_sdl2.pyx", line 75, in kivy.core.window._window_sdl2._WindowSDL2Storage.die

您是否有一个 repo,其中包含让 sdl2 + kivy 在没有 X 的情况下在 rpi4 上工作所需的所有更改?

我基本上按照 Amiberry 说明以最低要求编译 SDL2 (https://github.com/midwan/amiberry/wiki/Compile-SDL2-from-source) 并从源代码编译 SDL2_mixer,如果您需要 mp3、flac 等支持。 然后我将 _window_sdl2.pyx 文件中的 Alpha 位修改为 0。 最后,我修改了 setup.py 以强制 use_x11 为 False(在一个地方将其设置为 True)并运行export VIDEOCOREMESA=1 ,然后运行pip install . 。 我相信就是这样。 在编译所有 SDL2 库时我做的一件不同的事情是,当我运行 configure 时,我将--prefix=/usr到 args 以将库安装在正常位置而不是 /usr/local/lib。

@ddimensia谢谢! 那行得通:)

@ddimensia我刚刚打开了一个带有更改的 PR: https :

@ddimensia VIDEOCOREMESA=1是不需要的,所以我忽略了它。

@Lauszus嗨又是伙伴。
我在https://hub.docker.com/u/lauszus找到了你的 kivy 容器
我想知道您是否可以通过让 kivy 在容器内运行来为我指明正确的方向。
我的意思是,我运行良好,它显示在触摸屏上。
但无论我做什么,我都无法让触摸屏在容器内工作。
你会对此有所了解吗?
提前致谢。
干杯

@lucasnzone这是我在尝试交叉编译 Kivy 以加快构建速度时使用的旧容器。 我从来没有真正在容器内运行 Kivy,我只是用它来编译它。

无论如何,快速搜索告诉我,在运行容器时应该可以使用--device参数,即:

--device /dev/input/event0

应该将您的触摸屏添加到容器中。

请参阅: https :

@Lauszus嘿伙计,感谢您的回答。
这是在我的 docker run 命令中
--privileged --net host --device /dev/gpiomem:/dev/gpiomem --device /dev/ttyAMA0:/dev/ttyAMA0 -v /boot/overlay:/boot/overlay
我刚刚通过添加--device /dev/input/event0对其进行了测试
但仍然没有运气。
我即将放弃一起尝试使用容器。 我什至无法让 kivy 样本工作。
我什至用--privileged运行容器,但没有运气。
您会说这是 docker 配置问题还是 kivy 配置问题?
老实说,我迷路了,我花了一个星期的时间来解决这个问题,但无法弄清楚。
再次感谢您的回复伙伴,非常感谢

你确认你的触摸屏实际上是/dev/input/event0吗?

如果您只是弄乱示例,为什么还要在容器中运行它? 只需使用 Python 虚拟环境,并使用包管理(即apt等)为您的操作系统安装所需的依赖项。

@lucasnzone我忘了问你是使用树莓派还是其他平台? 另外你用的是哪个操作系统?

@Lauszus RPI4 与 raspbian lite
哦,不,我有一个实际的应用程序,我想在容器中运行它,因为它会使分发和版本控制更容易。
我正在尝试使用示例,因为如果我让它们工作,我可以用我的 kivy 应用程序做同样的事情。
如何验证我的触摸屏在 /dev/input 中的设备? 我没有这样做,没有

@lucasnzone这是我系统上的输出:

$ cat /proc/bus/input/devices | grep -P '^[NH]: ' | paste - -
N: Name="eGalax Inc. eGalaxTouch EXC3110-3883-08.00.00" H: Handlers=mouse0 event0

这意味着触摸屏位于/dev/input/event0

是的,我的也是事件
N: Name="ADS7846 Touchscreen" H: Handlers=mouse0 event0

好的。 该应用程序是否可与容器外的触摸屏配合使用?

@Lauszus
是的,我用Kivy-2.0.0rc1-cp37-cp37m-linux_armv7l.whl轮子完成了
最初使用不使用 Broadcom 驱动程序的前叉

好的。 你有什么错误? 是/dev/input/event0吗? 设备存在于容器内?

是的@Lauszus
我在容器中有crw-rw---- 1 root i2c 13, 64 Mar 12 22:56 event0crw-rw---- 1 root i2c 13, 64 Mar 12 22:56 mouse0

尝试只对输出进行分类,即cat /dev/input/event0 。 触摸屏幕时是否打印任何内容?

@Lauszus确实如此,随机字符
现在我比以前更困惑了

Super 这意味着容器正在获取输入。 您看到的是原始字节流,因此对您来说没有意义。 无论如何,这意味着您的 Kivy 配置中的某些内容不正确。

您可以尝试编译并运行此 C 代码吗(这是我用于调试屏幕的一些旧代码):

#include <stdio.h>
#include <linux/input.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>

static volatile sig_atomic_t run = 1;

void sigint(int sig) {
    run = 0;
}

int main() {
    signal(SIGINT, sigint);

    int fd = open("/dev/input/event0", /*O_NONBLOCK |*/ O_RDONLY);
    if (fd < 0) {
        printf("Failed to open device\n");
        return 1;
    }

    while (run) {
        struct input_event ev;
        int num_bytes = read(fd, &ev, sizeof(ev));
        if (num_bytes != sizeof(ev)) {
            printf("Failed to read device\n");
            return 1;
        }
        printf("%u, %u, %u, %u, %d\n", ev.time.tv_sec, ev.time.tv_usec, ev.type, ev.code, ev.value);
    }

    printf("Closing device\n");
    close(fd);
    return 0;
}

你可以像这样编译和运行它:

gcc touch.c -o touch && ./touch

@Lauszus
我从触摸中得到一些输出:

1584058230, 998152, 1, 330, 1
1584058230, 998152, 3, 0, 477
1584058230, 998152, 3, 1, 3477
1584058230、998152、3、24、64790
1584058230, 998152, 0, 0, 0
1584058231, 15687, 1, 330, 0
1584058231, 15687, 3, 24, 0
1584058231, 15687, 0, 0, 0

那是左下角

好的。 尝试将以下内容添加到代码的最顶部(重要的是它位于任何其他导入之上):

from kivy.config import Config
Config.set('input', 'mtdev_%(name)s', 'probesysfs,provider=mtdev')

好的,这是我运行应用程序时的输出,该代码位于最顶部:

[INFO] Logger:在/root/.kivy/logs/kivy_20-03-13_3.txt中记录日志
[信息] Kivy:v2.0.0.dev0,git-cef99e4,20191024
[信息] Kivy:安装在“/root/venv-kivy/lib/python3.7/site-packages/kivy/__init__.py”
[信息] Python:v3.7.3(默认,2019 年 4 月 3 日,05:39:12)
[海湾合作委员会 8.2.0]
[信息] Python:解释器位于“/root/venv-kivy/bin/python3”
[信息] 工厂:已加载 184 个符号
[信息] 图像:提供者:img_tex、img_dds、img_sdl2、img_gif(忽略 img_pil、img_ffpyplayer)
[信息] 文本:提供者:sdl2
[INFO] Window: Provider: sdl2(['window_egl_rpi'] 忽略)
[信息] GL:使用“OpenGL ES 2”图形系统
[信息] GL:使用后端
[信息] GL:OpenGL 版本 [信息] GL:OpenGL 供应商 [信息] GL:OpenGL 渲染器
[信息] GL:OpenGL 解析版本:2、1
[信息] GL:阴影版本
[信息] GL:纹理最大尺寸 <4096>
[信息] GL:纹理最大单位 <16>
[信息] 窗口:自动添加 sdl2 输入提供程序
[信息] 窗口:不允许使用虚拟键盘,单模式,未停靠
[INFO] Base:启动应用程序主循环
[INFO] GL:NPOT 纹理支持可用

它仍然没有响应触摸

您可以尝试安装libmtdev1包吗?

当然可以,我现在试试,然后再运行一次

@Lauszus已经安装了,同样的问题

@Lauszus我成功了! 感谢您的所有帮助伙伴!
%(name)s = hidinput,/dev/input/event0
我将该行添加到 .kivy/config.ini 中的[input]部分
再次感谢老哥!

@lucasnzone

对于任何阅读本文的人; https://github.com/kivy/kivy/pull/6769现已合并,因此不再需要对 Kivy 进行任何更改,但您仍然需要从源代码编译 SDL2。 说明可以在官方文档中找到: https :

@Lauszus
我按照您的说明使用 1Gb 版本的 Raspberry pi 4 和 2020-02-13 Lite OS。 但是还是找不到有价值的窗口提供者。 任何想法?

最好的事物,

@somber02如果您在我们的官方支持渠道(例如不和谐)上寻求进一步支持会更好。 我们更喜欢将 github 问题主要用于实际错误而不是支持。

@matham问题是生成文档的 CI 工作流存在问题,因此它没有在网站上更新: https :

@somber02现在你可以在这里找到文档: https :

好吧,我的错,我忘了合并https://github.com/kivy/kivy-server/pull/17。 现在应该修复了。

@matham谢谢。 请参阅: https :

@Lauszus ,嗨,Lauszus。 谢谢指教。 我点击了更新信息的链接,但它仍然失败,“无法找到任何窗口提供者”。 和“sdl2-runtimeError”无法初始化EGL”测试条件:

  1. 树莓派 4 1Gb 版本 2020-02-13 Lite Raspberrian。
  2. 重新编译sdl2后,重启
  3. 从最新版本的 pypi、master 分支、最新的轮子和最新的开发版本进行全局安装测试。
  4. 在少数情况下,错误消息显示它找不到 x11 窗口提供程序,在这种情况下,我将 KIVY_WINDOW=sdl2 强制它使用 sdl2。

难道我做错了什么?

@somber02你是从 master 分支编译 Kivy 的吗? 如果没有,请这样做,因为预制的轮子尚未更新。

@somber02还请注意,您不应该使用 apt 安装这些依赖项:

libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

因为你想使用你自己编译的版本。

@Lauszus谢谢。 我只是在没有仔细查看的情况下复制了依赖项....谢谢,这就是原因。 在我清除这些包并重新安装编译后的 sdl2 包后,它可以工作了。

非常感谢您的辛勤工作。

@somber02https :

顺便说一句,您是否也遇到过这个问题: https :

@Lauszus ,我可以确认它是硬件加速的。 谢谢

@Lauszus

请注意,您不应使用 apt 安装这些依赖项:

在 Kivy 安装说明的这种情况下,您甚至可能建议用户在开始编译sdl2之前主动为该短列表执行sudo apt-get remove ...sudo apt-get purge ... sdl2 。 对于我们大多数人来说,我们可能正在尝试修复较早的尝试,因此我们会安装默认的软件包版本。

@Lauszus 了不起的工作 - 这为我解决了让 kivy 在 buster lite 上运行的所有问题。

我可以建议澄清一下,如果您在 pi 4 上进行 buster lite 设置,指南中指出完全跳过第 2 步吗?

此外,是否有维护硬件加速的解决方法,使您能够旋转配置方向? 我可以看到这有效的唯一方法是使用 x11 或禁用 V3D 驱动程序。

https://github.com/pimoroni/hyperpixel4/issues/39

如果您使用的是 Buster lite,则不应跳过@pwdavari第 2 步,因为除非他们更新了 SDL2 包,否则您需要从源代码编译 SDL2?

您可以通过在/boot/cmdline.txt添加以下内核命令来旋转显示:

video=HDMI-A-1:1920x1080M<strong i="9">@60</strong>,margin_left=0,margin_right=0,margin_top=0,margin_bottom=0,rotate=90,reflect_x

请参阅: https :

如果你只想在 Kivy 中旋转显示:

from kivy.config import Config
Config.set('input', 'mtdev_%(name)s', 'probesysfs,provider=mtdev,param=rotation=90,param=invert_y=1')

@Lauszus谢谢回复

我只是从文档的第 3 步中提到这一点:

3. Now simply follow the Raspberry Pi 1-4 installation instructions to install Kivy, but do NOT install the SDL2 packages using apt.

如果您已经从源代码安装了 sdl 包并按照步骤 -> sudo make install 进行安装,我们不应该跳过正常 Pi 1-4 设置的第 2 步吗?

或者是说您应该按照步骤操作但不要使用 apt 安装,所以您可以这样做:

install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

@Lauszus

我没有将 video= 参数放在同一行上。 直到您将我指向文档,我才注意到它非常明确地指出所有 cmdline.txt 参数/配置都需要在一行上。 菜鸟失误。

谢谢你的帮助!

@pwdavari是的,您需要跳过“Raspberry Pi 1-4 安装”下的第 2 步。

此页面是否有帮助?
0 / 5 - 0 等级