Kivy - NotImplementedError: tostring() удален

Прошло несколько дней с тех пор, как я застрял с этой ошибкой. Как вы можете видеть в журнале, у меня есть последняя версия Kivy и Python, но я получаю PermissionError и NotImplementedError. я пытался запустить его как суперпользователь, но он все еще не работает, так как я знаю, что он должен работать без него.

когда я запускаю его, появляется окно, но оно вообще не отображает текст, есть только один артефакт в середине, который исчезает, когда я нажимаю кнопку, все остальное вроде в порядке.

from kivy.app import App
from kivy.uix.button import Button

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

TestApp().run()



[INFO              ] [Logger      ] Record log in /home/shalva/.kivy/logs/kivy_17-01-16_7.txt
[INFO              ] [Kivy        ] v1.9.1
[INFO              ] [Python      ] v3.6.0 (default, Dec 24 2016, 08:03:08)
[GCC 6.2.1 20160830]
[INFO              ] [Factory     ] 179 symbols loaded
[INFO              ] [Image       ] Providers: img_tex, img_dds, img_gif, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO              ] [Text        ] Provider: pil(['text_sdl2'] ignored)
[INFO              ] [OSC         ] using <multiprocessing> for socket
[INFO              ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO              ] [GL          ] OpenGL version <b'3.0 Mesa 13.0.3'>
[INFO              ] [GL          ] OpenGL vendor <b'Intel Open Source Technology Center'>
[INFO              ] [GL          ] OpenGL renderer <b'Mesa DRI Intel(R) Sandybridge Mobile '>
[INFO              ] [GL          ] OpenGL parsed version: 3, 0
[INFO              ] [GL          ] Shading version <b'1.30'>
[INFO              ] [GL          ] Texture max size <8192>
[INFO              ] [GL          ] Texture max units <16>
[INFO              ] [Window      ] auto add sdl2 input provider
[INFO              ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO              ] [ProbeSysfs  ] device match: /dev/input/event6
[INFO              ] [MTD         ] Read event from </dev/input/event6>
[INFO              ] [Base        ] Start application main loop
[INFO              ] [GL          ] NPOT texture support is available
 Exception in thread Thread-1:
 Traceback (most recent call last):
   File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
     self.run()
   File "/usr/lib/python3.6/threading.py", line 864, in run
     self._target(*self._args, **self._kwargs)
   File "/usr/lib/python3.6/site-packages/kivy/input/providers/mtdev.py", line 219, in _thread_run
     _device = Device(_fn)
   File "/usr/lib/python3.6/site-packages/kivy/lib/mtdev.py", line 131, in __init__
     self._fd = os.open(filename, os.O_NONBLOCK | os.O_RDONLY)
 PermissionError: [Errno 13] Permission denied: '/dev/input/event6'

 Exception ignored in: 'kivy.graphics.instructions.RenderContext.set_texture'
 Traceback (most recent call last):
   File "kivy/graphics/texture.pyx", line 786, in kivy.graphics.texture.Texture.bind (kivy/graphics/texture.c:10206)
   File "/usr/lib/python3.6/site-packages/kivy/core/text/__init__.py", line 628, in _texture_fill
     self.render(real=True)
   File "/usr/lib/python3.6/site-packages/kivy/core/text/__init__.py", line 573, in render
     return self._render_real()
   File "/usr/lib/python3.6/site-packages/kivy/core/text/__init__.py", line 559, in _render_real
     data = self._render_end()
   File "/usr/lib/python3.6/site-packages/kivy/core/text/text_pil.py", line 57, in _render_end
     self._pil_im.mode.lower(), self._pil_im.tostring())
   File "/usr/lib/python3.6/site-packages/PIL/Image.py", line 697, in tostring
     "Please call tobytes() instead.")
 NotImplementedError: tostring() has been removed. Please call tobytes() instead.
[INFO              ] [Base        ] Leaving application in progress...

person George Shalvashvili    schedule 16.01.2017    source источник


Ответы (1)


Я не уверен насчет PermissionError, но могу помочь решить NotImplementedError. Это, в свою очередь, может решить проблему PermissionError.

Вы используете модуль Python PIL, в котором раньше была функция tostring(), но вместо этого она была изменена на tobytes(). Однако пакет kivy не обновлялся, поэтому он по-прежнему вызывает tostring(), что устарело.

So, go to

/usr/lib/python3.6/site-packages/kivy/core/text/text_pil.py

на вашем компьютере и измените строку 57 с

 self._pil_im.mode.lower(), self._pil_im.tostring())

to

 self._pil_im.mode.lower(), self._pil_im.tobytes())

Это должно решить вашу проблему.

Когда вы пытаетесь отредактировать файл, он может сказать, что у вас нет необходимых прав для их редактирования. Если это так, то я бы порекомендовал ввести в командной строке (или терминале/любой консоли bash) sudo idle. Затем из режима ожидания откройте файл и отредактируйте его. (Обратите внимание, что вы можете отредактировать его так, как вам нравится, с помощью sudo, например, sudo nano и т. д.).

person Tom Burrows    schedule 16.01.2017
comment
Спасибо, текст отображается. я все еще получаю PermissionError, но, похоже, это не имеет никакого эффекта ... Последний выпуск Kivy был 1 год назад, и на github у них много активности, почему они не выпускают новую версию? - person George Shalvashvili; 16.01.2017
comment
@GeorgeShalvashvili, я не уверен. Возможно, он предназначен для работы с более старой версией PIL (до удаления tostring). Или у вас как-то не самая последняя версия...? Я бы не беспокоился об этом. Не стесняйтесь публиковать это исправление (ссылка на эту страницу, если хотите) где-нибудь, где его увидят разработчики Kivy (может быть, на Github?), они могут объяснить, почему оно не работает из коробки. - person Tom Burrows; 18.01.2017
comment
И если это устранило вашу ошибку, отметьте ее как «отвеченную», нажав на галочку под символами «за»/«против». - person Tom Burrows; 18.01.2017