Nedenini anlamadığım beklenmedik bir hata

Merhaba arkadaşlar.
Ben ubuntu 18.04 kullanıyorum. Kivy kullanarak kendi programımı yazıyorum. Kodlarımı çalıştırınca sıkıntı yaşamıyordum. Builder.load_file ile tam dizin belirterek .kv dosyamı sorunsuz yüklüyor sorunsuz çalıştırıyordum. Ancak dün yani 21 haziran 2019’da ubuntunun sistem güncellemesinden sonra şöyle bir hata mesajı aldım:

Traceback (most recent call last):
File “main.py”, line 16, in
Builder.load_file("/home/omer/Masaüstü/yol/yol.kv")
File “/usr/lib/python3/dist-packages/kivy/lang/builder.py”, line 301, in load_file
return self.load_string(data, **kwargs)
File “/usr/lib/python3/dist-packages/kivy/lang/builder.py”, line 399, in load_string
widget = Factory.get(parser.root.name)(__no_builder=True)
File “/usr/lib/python3/dist-packages/kivy/factory.py”, line 130, in getattr
raise AttributeError
AttributeError

Daha önce sorunsuz çalıştırdığım kodlarımdan şimdi neden bu hatayı alıyorum. Ubuntu ile mi alakalı. Sizce ne yapmalıyım.

İşte İnterpreterin sevmediğim kısmı öyle bir haya veriyor ki ne dediğini anlıyana helal olsun araştırma yapacaksın o bile zor varsa bilen sorunu bizi de bilgilendirsin :slight_smile:

Ubuntuya gelen özelliklerden izinler etkiliyor olabilir mi?

Hayir.


Ya kivy’de (ya da Python’da) uyum bozan bir degisiklik olmus, ya da kullandigin resmi olmayan seylerden bir tanesi yeni bir versiyonda gitmis. (Veya update’in yan etkilerinden bir tanesi etkiliyor da olabilir ama dusuk ihtimal.)

Fakat google’a soracagin seyi buraya sormussun, biz de senin yerine google’a soruyoruz.

Buradaki insanlardan yardim istiyorsan kaynak kodunu ve kullandigin Python ve kutuphanelerin versiyonlarini yazman lazim.

Merhabalar. Aşağıda basit bir program var. Çalıştırınca yine aynı hatayı veriyor:

main.py:

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

Builder.load_string("/home/omer/Masaüstü/deneme.kv")

class ekran(Screen):
pass

sm = ScreenManager()
sm.add_widget(ekran(name = “ekranim”))

class abc(App):
def build(self):
return sm

abc().run()

deneme.kv:

:
BoxLayout:
Button:
text: “Deneme”

Aldığım hata mesajı:

Traceback (most recent call last):
File “main.py”, line 4, in
Builder.load_string("/home/omer/Masaüstü/deneme.kv")
File “/usr/lib/python3/dist-packages/kivy/lang/builder.py”, line 399, in load_string
widget = Factory.get(parser.root.name)(__no_builder=True)
File “/usr/lib/python3/dist-packages/kivy/factory.py”, line 130, in getattr
raise AttributeError
AttributeError

Kodları

“[code] [/*code]”

arasına almalısınız ki kod görünüşü kazansın tabii * yi silip koyacaksınız

load_string() değil, load_file() olması gerekiyor. Çünkü siz bir dosyadan yükleme yapıyorsunuz. load_string() içerisinde yanlış bir girdi olduğu için hata veriyor. Ayrıca önceden nasıl çalışıyordu anlamadım.

(son attığınız koddan bahsediyorum)

efendim çok pardon. Ben bu kodu hangi kafayla buraya koyduğumu hatırlamıyorum. Artık o zaman nasıl bir dalgınlık varsa bende gelmişi bu kodu paylaşmışım. İşte asıl programım içindeki Builder’i kullanışım:

Ekran%20G%C3%B6r%C3%BCnt%C3%BCs%C3%BC%20-%202019-06-22%2023-13-53

Buda aldığım hataya dair ekran görüntüsü:

Hata mesajında da gördüğünüz gibi 18. satırda Builder.load_file() kısmında hata veriyor.

Gündüz dalgın bir kafa yapısıyla paylaştığım kodlardan ötürü özür dilerim.

Merhaba. Biraz Kivy’nin kaynak kodlarını inceledim (çok detaylı değil, yanlışım olabilir) ve şunlarla karşılaştım.

kivy/lang/builder.py#L383

(...)
            if parser.root:
                widget = Factory.get(parser.root.name)(__no_builder=True)
(...)

kivy/factory.py#L127

(...)
        if name not in classes:
            if name[0] == name[0].lower():
                # if trying to access attributes like checking for `bind`
                # then raise AttributeError
                raise AttributeError
(...)

if __name__ == '__main__':
    Factory.register('Vector', module='kivy.vector')
    Factory.register('Widget', module='kivy.uix.widget')

parser.root.name'in aldığı değeri incelemekte fayda var, ve isimlendirme konusunda kurallar vs yazıyorsa dökümanlarda, göz gezdirmenizi öneririm. Buradan anlaşıldığı kadarıyla (if name[0] == name[0].lower()), name değişkeni tamamen küçük harflerden oluşmamalı. (Belki Widget yazmanız gerekirken widget yazmış olabilirsiniz.)

sorunu buldum. Kodların en sonunda yanlışlıkla eklenmiş bir c harfi varmış. Meğer bütün sorun oymuş, onu silince her şey düzeldi. Forumu da boşuna meşgul etmiş olduk. (Ama bana da hak verin yani. Bu hata mesajına bakınca insan sorunun ne olduğunu anlayamıyor ve hata mesajından dolayı sorunu bambaşka yerlerde arıyor. :slight_smile: :blush: )

İnterpreter işte o yüzden sevmiyorum yorumlamalı dilleri sabaha kadar farketmezsin oradaki c yi çok aşağıda olduğunu farzet.

3 Beğeni