Window.screenshot возвращает черный экран на iOS

Я пишу простое приложение для рисования в Kivy. Он отлично работает на iPhone и iPad, но возвращает только черный экран. Что я сделал не так? Кроме того, есть ли способ сохранить скриншот() непосредственно в Dropbox/iCloud/Files-App?


    class DrawInput(Widget):

    def btn_save(self):


        user_data_dir = App.get_running_app().user_data_dir

        name = join(user_data_dir, "filename.png")

        Window.screenshot(name)     

    def on_touch_down(self, touch):
        with self.canvas:
            Color(0, 0, 0)
            touch.ud["line"] = Line(points = (touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud["line"].points += (touch.x, touch.y)

    def on_touch_up(self, touch): 
        pass

    presentation = Builder.load_file("app_kivy.kv")

    class drawingapp(App):
    def build(self):
        return presentation

    if __name__= = "__main__":
        drawingapp().run()

Киви:-


    Screen:

      name: "drawing"
      on_pre_enter: drawing.canvas.clear()

      FloatLayout:

         DrawInput:
            id: drawing
         Button:
            text: "finish"
            on_press: drawing.btn_save()

Я ожидаю получить скриншот рисунка.

Вы тестировали его на других платформах (Windows, Linux и т.д.)?

me2 beats 14.05.2019 09:04

Нет, я не делал. У меня нет ни винды, ни линукса.

Dawid Archibald 14.05.2019 09:40

Не могли бы вы подготовить простое и короткое приложение, которое дает вам черный экран? Причин черного экрана может быть много, например, вы могли случайно сделать canvas.clear перед тем, как сделать скриншот

me2 beats 14.05.2019 10:16

Я делаю это за минуту, но... будет ли приложение возвращать правильный снимок экрана на компьютере (до запуска в Xcode)? '''window.screenshot()''' отлично работает на питоне, проблема появляется только после установки на iPhone и iPad.

Dawid Archibald 14.05.2019 10:25

Я добавил код на GitHub: github.com/ksgfan/приложение для рисования

Dawid Archibald 14.05.2019 11:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу проверить ваш код для iOS прямо сейчас, (постараюсь сделать это чуть позже.), но в Linux (Ubuntu) он работает нормально: пользователь может сделать скриншот всей области приложения, изображение сохраняется в формате png в исходной папке (к сожалению, я не совсем разобрался с вашими путями вывода, поэтому заменил значение имени на name = 'test.png').

затем я написал минимальный пример, который также работает в моей системе:

from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window

KV = '''
Button:
    text: 'Save'
    on_press: app.btn_save()
'''

class ApplePenApp(App):

    def build(self):
        self.root = Builder.load_string(KV)

    def btn_save(self):
        Window.screenshot('test.png')

ApplePenApp().run()

Пожалуйста, проверьте, работает ли он в вашей системе (если работает, то, скорее всего, проблема где-то в вашем коде).

Я обнаружил проблему с черным скриншотом только тогда, когда делал что-то вроде этого:

from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window

KV = """
Button
    text: '123456'
"""

class MyApp(App):
    def build(self):
        self.root = Builder.load_string(KV)
        self.make_screenshot()

    def make_screenshot(self):
        Window.screenshot('test.png')

MyApp().run()

Однако я также видел проблемы с Window.screenshot у некоторых пользователей, например: https://github.com/kivy/kivy/issues/4514

Кстати, в качестве более продвинутой альтернативы Window.screenshot вы можете попробовать export_to_png. Вы можете использовать этот метод для любого виджета, вот краткий пример:

from kivy.app import App
from kivy.lang import Builder

KV = '''
Button:
    text: 'Save'
    on_press: app.btn_save(self)
'''

class ApplePenApp(App):

    def build(self):
        self.root = Builder.load_string(KV)

    def btn_save(self, inst):
        inst.export_to_png('test.png')

ApplePenApp().run()

Вы не можете использовать его для окна, но вы можете использовать его для экрана (в вашем случае это может быть "рисунок" SecondScreen):

from kivy.app import App
from kivy.lang import Builder

KV = '''
ScreenManager
    Screen
        id: screen
        Button:
            text: 'Save'
            on_press: app.widget_save(screen)
'''

class ApplePenApp(App):

    def build(self):
        self.root = Builder.load_string(KV)

    def widget_save(self, inst):
        inst.export_to_png('test.png')

ApplePenApp().run()

пожалуйста, проверьте, работают ли эти примеры для вас.

Минимальный пример работает хорошо. К сожалению, реализация этого в моем коде не работает. Я все еще получаю черное изображение в виде файла png. 'export_to_png()' возвращает кнопки и рисунки, как и должно быть, но на черном экране (должен быть белым). Спасибо большое, попробую позже как-то изменить свой код.

Dawid Archibald 15.05.2019 16:20

Я решил проблему с stackoverflow.com/questions/20872598/…

Dawid Archibald 15.05.2019 20:02

Другие вопросы по теме