screenshot() 报错:ImportError: 无法导入名称 glReadPixels 的错误在 kivy 中

1 投票
3 回答
1764 浏览
提问于 2025-04-18 00:38

在kivy中,要截取窗口的屏幕,可以按照文档中的说明使用screenshot(name='screenshot{:04d}.png')。

http://kivy.org/docs/api-kivy.core.window.html?highlight=screenshot#kivy.core.window.WindowBase.screenshot

不过,当我尝试这样做时,出现了以下错误:

错误追踪信息(最近的调用在最前面): 文件 "D:/Paarth/Google_Drive/Google Drive/Codes/Python/Work/kivy/kivyBasics/Screenshots_SaveImage.py",第 26 行,在 MyApp().run() 文件 "C:\Kivy-1.8.0-py2.7-win32\Python27\lib\kivy\app.py",第 766 行,在 run root = self.build() 文件 "D:/Paarth/Google_Drive/Google Drive/Codes/Python/Work/kivy/kivyBasics/Screenshots_SaveImage.py",第 19 行,在 build Window.screenshot(name='screenshot{:04d}.png') 文件 "C:\Kivy-1.8.0-py2.7-win32\Python27\lib\kivy\core\window\window_pygame.py",第 250 行,在 screenshot from kivy.core.gl import glReadPixels, GL_RGBA, GL_UNSIGNED_BYTE 导入错误:无法导入名称 glReadPixels

使用的代码:

import  kivy
kivy.require ( '1.8.0 ' )
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.core.window import WindowBase
from kivy.core.window import Window


class MyWidget(Widget):
    pass

class MyApp(App):
    def build(self):
        parent = MyWidget()

        a = Button(text="hello")
        parent.add_widget(a)
        Window.screenshot(name='screenshot{:04d}.png')

        return parent


if __name__ == '__main__':
    MyApp().run()

3 个回答

0

这看起来像是个错误,我已经报告了这个问题。

在此期间(和你之前的问题有关),你可以使用Widget的新方法export_to_png,只需把它的代码复制到你自己的小部件里就可以了,你可以在GitHub上找到这段代码

1

你可以在 kivy.graphics.opengl 中找到 glReadPixels。在 Python 解释器中试试下面的代码:

>>> from kivy.graphics.opengl import glReadPixels
1

为了更清楚地理解inclement的回答,你需要在你的Python文件中包含export_to_png这个功能。这样做可以帮助你更好地实现你的目标。

from kivy.graphics import Canvas, Translate, Fbo, ClearColor, ClearBuffers
kv = '''
cameraWidget:
    orientation: 'vertical'
    Camera:
        id: camera
        resolution: (640, 480)
        play: False
    ToggleButton:
        text: 'Play'
        on_press: camera.play = not camera.play
        size_hint_y: None
        height: '48dp'
    Button:
        text: "Take picture"
        on_press: root.TakePicture()
        height: '48dp'

'''
class cameraWidget(BoxLayout):
    def TakePicture(self, *args):
        self.export_to_png = export_to_png
        self.export_to_png(self.ids.camera, filename='test2.png')

class MyApp(App):
    def build(self):
        return Builder.load_string(kv)

if __name__ == '__main__':
    MyApp().run()

撰写回答