Kivy - NotImplementedError: tostring() telah dihapus

sudah berhari-hari sejak saya terjebak dengan kesalahan ini. Seperti yang Anda lihat di log, ada Kivy dan Python versi terbaru tetapi saya mendapatkan PermissionError dan NotImplementedError. Saya mencoba menjalankannya sebagai pengguna super tetapi masih tidak berhasil, karena saya tahu itu harus berfungsi tanpanya.

ketika saya menjalankannya sebuah jendela muncul tetapi tidak menampilkan teks sama sekali, hanya ada satu artefak di tengah yang menghilang ketika saya mengklik tombol, semuanya tampak baik-baik saja.

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 sumber


Jawaban (1)


Saya tidak yakin tentang PermissionError, tapi saya dapat membantu menyelesaikan NotImplementedError. Hal ini pada gilirannya dapat mengatasi PermissionError.

Anda menggunakan modul Python PIL, yang dulunya memiliki fungsi tostring(), namun kini diubah menjadi tobytes(). Namun paket kivy belum diperbarui sehingga masih memanggil tostring() yang sudah tidak digunakan lagi.

So, go to

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

di mesin Anda dan ubah baris 57 dari

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

to

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

Ini seharusnya menyelesaikan masalah Anda.

Saat Anda mencoba mengedit file, mungkin dikatakan bahwa Anda tidak memiliki izin yang diperlukan untuk mengeditnya. Jika demikian, maka saya sarankan mengetik di Command Line (atau Terminal/Konsol bash apa pun) sudo idle. Kemudian, dari waktu idle, buka file dan edit. (NB Anda dapat mengeditnya sesuka Anda dengan sudo misalnya sudo nano dll).

person Tom Burrows    schedule 16.01.2017
comment
Terima kasih, teks telah ditampilkan. saya masih mendapatkan PermissionError tetapi sepertinya tidak berpengaruh apa pun... Rilis Kivy terakhir adalah 1 tahun yang lalu dan di github mereka memiliki banyak aktivitas, mengapa mereka tidak merilis versi baru? - person George Shalvashvili; 16.01.2017
comment
@GeorgeShalvashvili, saya tidak yakin. Mungkin ini dirancang untuk bekerja dengan PIL versi lama (sebelum tostring dihapus). Atau Anda entah bagaimana belum mendapatkan versi terbaru...? Saya tidak akan mengkhawatirkannya. Jangan ragu untuk memposting perbaikan ini (tautan ke halaman ini jika Anda mau) di suatu tempat di mana pengembang Kivy akan melihatnya (mungkin Github?), mereka mungkin dapat menjelaskan mengapa ini tidak langsung berfungsi. - person Tom Burrows; 18.01.2017
comment
Dan jika ini mengatasi kesalahan Anda, harap tandai sebagai 'dijawab' dengan mengklik tanda centang di bawah simbol upvote/downvote. - person Tom Burrows; 18.01.2017