Kivy - NotImplementedError: tostring() ถูกลบแล้ว

เป็นเวลาหลายวันแล้วที่ฉันติดอยู่กับข้อผิดพลาดนี้ อย่างที่คุณเห็นในบันทึกมี Kivy และ Python เวอร์ชันล่าสุด แต่ฉันได้รับ PermissionError และ NotImplementedError ฉันพยายามเรียกใช้ในฐานะ superuser แต่ก็ยังใช้งานไม่ได้ เพราะฉันรู้ว่ามันต้องใช้งานได้หากไม่มีมัน

เมื่อฉันเรียกใช้มัน หน้าต่างจะปรากฏขึ้นแต่มันไม่แสดงข้อความใดๆ เลย มีเพียงสิ่งประดิษฐ์เดียวที่อยู่ตรงกลางซึ่งหายไปเมื่อฉันคลิกปุ่ม อย่างอื่นดูเหมือนจะปกติดี

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())

สิ่งนี้น่าจะแก้ปัญหาให้คุณได้

เมื่อคุณพยายามแก้ไขไฟล์ อาจแจ้งว่าคุณไม่มีสิทธิ์ที่จำเป็นในการแก้ไข หากเป็นเช่นนั้น ฉันขอแนะนำให้พิมพ์ใน Command Line (หรือ Terminal/Any bash console) 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 devs จะเห็น (อาจเป็น Github) พวกเขาอาจอธิบายได้ว่าทำไมมันถึงใช้งานไม่ได้ทันที - person Tom Burrows; 18.01.2017
comment
และหากวิธีนี้แก้ไขข้อผิดพลาดของคุณได้ โปรดทำเครื่องหมายว่า 'ตอบแล้ว' โดยคลิกที่เครื่องหมายถูกด้านล่างสัญลักษณ์โหวตเห็นด้วยหรือไม่เห็นด้วย - person Tom Burrows; 18.01.2017