لماذا لدي هذه TypeError عند استخدام tkinter؟
-
05-07-2019 - |
سؤال
وحتى أنا ورفع مستواها إلى الثعبان 3.1.1 من 2.6 وركضت برنامج قديم لي والذي يستخدم tkinter.
وأحصل على رسالة الخطأ التالية التي لا أذكر في الحصول على الإصدار 2.6.
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
return self.func(*args)
File "C:\myprog.py", line 77, in <lambda>
self.canvas.bind("<Button-3>", lambda event: myfunc_sub(event))
File "C:\myprog.py", line 65, in myfunc_sub
temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])
TypeError: 'map' object is not subscriptable
وأنا متأكد من خط
temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])
وكان طيب في الإصدار الأقدم. لست متأكدا ما الذي تغير حتى أن الطريقة أحصل على كل تنسيق غير ممكن.
<اقتباس فقرة>و". find_enclosed (X1، Y1، X2، Y2) ترجع قائمة معرفات كائن من كافة الكائنات التي تحدث تماما داخل المستطيل الذي الأيسر العلوي الزاوية هو (X1، Y1) والزاوية اليمنى السفلى هي (X2، Y2).
و.find_overlapping (X1، Y1، X2، Y2) مثل الطريقة السابقة، ولكن ترجع قائمة معرفات كائن من كافة الكائنات التي تشترك نقطة واحدة على الأقل مع المستطيل معين. "
اقتباس فقرة>وأي أفكار حول كيفية إصلاح هذا؟ واسمحوا لي أن أعرف إذا كنت بحاجة إلى مزيد من المعلومات. النسخة tkinter لدي هو 8.5، ولدي 3.1.1 الخمول وبايثون 3.1.1. وأنا أعلم الرابط الشعبي ط المقدمة هو 8.4، ولكن لا أستطيع أن أتصور كان هناك تغيير في هذه الوظائف.
وذلك بفضل!
المحلول
self.canvas.coords(name)
وإرجاع map object
، ووجوه دول الخطأ map
هو unsubscriptable في بيثون 3. تحتاج إلى تغيير coords
أن تكون الصفوف (tuple) أو قائمة.
وكنت بحاجة إلى تغيير التعليمات البرمجية لتكون:
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
نصائح أخرى
وكانت هناك عدة تغييرات كسر من بيثون 2.X لبيثون 3.X - بينهم، وظائف map
ل
هل تشغيل البرنامج النصي من خلال 2to3 حتى الآن؟