2016-08-22 21 views
3

idを使用して特定のClickableImageを取得しようとするたびに、次のエラーが発生します。Python - Kivy:AttributeError:self.idsを取得しようとすると 'super'オブジェクトに属性 '__getattr__'がありません

AttributeError: 'super' object has no attribute '__getattr__' 

私はこの問題の解決策を探すためにしようと時間を費やしてきた、私は同じ問題で他の人を見て、人々は、ビルダーのサイトを変更するには彼らに言った、それ理由ids属性などを取得するためには最初に呼び出す必要がありましたが、ビルダーを移動するたびに「クラス定義されていません」というエラーが発生します。すべての手がかりは?ここで

は私のコードです:

from kivy.app import App 
from kivy.config import Config 
from kivy.lang import Builder 
from kivy.graphics import Line 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.widget import Widget 
from kivy.uix.image import Image 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.behaviors import ButtonBehavior 

#Variables 
cords =() 
bld = Builder.load_file('conf.kv') 

class Manager(ScreenManager): pass 
class Principal(Screen): pass 

class ClickableImage(ButtonBehavior, Image): 
    def on_press(self): 
     self.source = 'button_press.png' 

    def on_release(self): 
     self.source = 'button.png' 
     self.ids.uno.source = 'button_press.png' 

class canva(Widget): 
    def on_touch_down(self, touch): 
     global cords 
     with self.canvas: 
      touch.ud['line'] = Line(points=(touch.x, touch.y), width=1.5) 
     cords = (touch.x, touch.y) 

    def on_touch_move(self,touch): 
     global cords 
     touch.ud['line'].points = cords + (touch.x, touch.y) 

    def on_touch_up(self,touch): 
     self.canvas.clear() 

class Api(App):  
    def build(self): 
     return bld 

if __name__ == '__main__': 
    Api().run() 

、ここでは私の.kvファイルです:

# conf to file: test.py 

<Manager>: 
    Principal: 

<Principal>: 
    GridLayout: 
     size_hint_x: 0.5 
     size_hint_y: 0.6 
     width: self.minimum_width 
     cols: 3 
     ClickableImage: 
      id: 'uno' 
      size: 10,10 
      source: 'button.png' 
      allow_strech: True 
     ClickableImage: 
      id: 'dos' 
      size: 30,30 
      source: 'button.png' 
      allow_strech: True 
    canva: 
+1

+ 'self.parent.parent.ids'を使用し、' self.ids'は – KeyWeeUsr

答えて

4

はの出力を見てみましょう:KV言語id

'super' object has no attribute '__getattr__' 

が設定されています特殊な方法(現在は1.9.2まで)で、その値は文字列ではありません。これはカジュアルな変数ではないからです。 <widget>.idでアクセスすることはできません。

これはウィジェットではないcanvasと似ていますが、そのように見えるかもしれません(これが私のコードで混乱しています:P)。あなたはすでにsomething: <some object>がPythonのsomething = <object>と似ていることに気がつきました。それは(少なくとも私が考えている)idの値が文字列ではないことです(いくつかは奇妙です)。 idが文字列の場合は、値をカジュアルに割り当てることから何らかの形で除外するチェックが必要になるでしょう。たぶんそれはパフォーマンスか単純さのためです。

したがって、idは将来のキーワードのキーワードです。実際には、idに割り当てられた文字がWeakProxyから得られたオブジェクトの値を持つ文字列キーになり、WeakProxyが指し示すオブジェクトになります。またはより良い言った:

id: value 

valueはあなたが値として文字列を使用する場合は、その オブジェクト(何 print(self)が戻ってくる)

私は(わからない)容疑者となっ

<some_root_widget>.ids[str(value)] = weakref.proxy(value) 

なりidの場合、文字列を指すweakref/WeakProxyになります。私はポインタを思い出させるので、pointという単語を使用し、Cのポインタと混同しないでください。

  • superは、あなたがあなたと同じエラーになります

  • print('string id'.__getattr__)から継承したクラスへのアクセスを提供しますが、'super'がで置換されています

    は今、あなたは出力で再び見れば本当の価値、よく...それはあなたがid文字列値を割り当てる場合、あなたはこのような状況に取得します__getattr__

  • したがって

を持っていません。

<some_root_widget>.ids[str('value')] = weakref.proxy('value') # + little bit of magic 

str('value')は必ずしも間違っていないですが、デフォルトでは、文字列に対してweakref.proxyを作成することはできません。私はKivyがWeakProxiesでこれをどのように処理するかはわかりませんが、文字列をidに割り当てると、おおよそこれが得られます。

(私が間違っているなら、私を修正してください)

+0

存在しないので、私は呼び出して、オブジェクトへのリンクを得ることができました'Principal()。ids.uno'(私は 'uno'オブジェクトに行きます)のプリンシパルクラスから、' <__ main __。ClickableImage object at 0x7f394cb428d8> 'を返すと、 Principal()。ids.uno.source'を呼び出し、button.png(ソース)を返します。しかし、Button_press.pngにソースを設定しようとすると、ローカルでしか変更されません(新しい値を印刷することはできますが、画面上では変更されません)。どうすれば値を変更できますか? (ボタンを押すだけではなく、ボタンを変更しようとしています)。ありがとうございました:) – gramsch

+2

@gramschコメント( 'Class().ids.sumething')に書いたようにすると、呼び出しごとに新しいインスタンスが作成され、必要なものは変更されません。このトピックは最初から混乱しています。非OOPの方がいらっしゃいましたら、混乱してください。とにかく、それをもっと説明すると: ':'をkvに入れると 'class Principal ...:'と似ていますが、 'Principal:'を実行すると(括弧は見えません)、インスタンスが作成されます'マネージャー 'の子供。プロパティを変更するインスタンスにアクセスする必要があります。 '' dos' "ボタンの中で:' on_release:uno.source = ' – KeyWeeUsr

+0

または' ClickableImage'クラス: 'self.parent.parent.ids.uno.source = ' – KeyWeeUsr

関連する問題