on_propertyへのキビのバインディングは働いていません -- python フィールド と binding フィールド と kivy フィールド 関連 問題

Kivy binding to on_property doesn't seem to work












0
vote

問題

日本語

本質的に、私は正方形のグリッドを持っています、そして私はどの正方形が各正方形のブレアープロパティで占められているかを追跡します。これは私のコードのすべての場所の単純化されたバージョンです私は "占有された"プロパティを宣言しています:

<事前> <コード> class Board(GridLayout): def __init__(self): super().__init__() self.cols = 4 self.grid = [] self.create_slots() def create_slots(self): for i in range(10): self.grid.append([]) for j in range(4): temp = Square(i,j, "sideboard") self.grid[i].append(temp) self.add_widget(temp) temp.bind(on_occupied = self.do_a_thing) def do_a_thing(self): for square in self.children: #do a thing class Square(Button): def __init__(self, row, col, type): self.row = row self.col = col self.id = str(self.row) + "," + str(self.col) self.type = type self.occupied = BooleanProperty(False) super().__init__()

私の目標は、正方形の「占有」プロパティの値が変化するたびに呼び出される「DO_A_THENS」メソッドをバインドすることです。スクエアクラスは私のアプリの他の場所で使用されているので、キビの言語でon_ocumusedのコールバックを設定したくありません。

を変更するためだけに正方形のサブクラスの作成を避けることを望んでいました。

コードを実行するとエラーがなくなり、「占有」財産が実際に変わることを確認しました。しかし、 "do_a_thing"メソッドは決して解雇されません。誰かが私が間違っていることを教えてもらえますか?

英語

Essentially, I have a grid with squares, and I keep track of which squares are occupied with a BooleanProperty on each square. Here's a simplified version of all the places in my code I declare the "occupied" property:

class Board(GridLayout):     def __init__(self):         super().__init__()         self.cols = 4         self.grid = []         self.create_slots()         def create_slots(self):         for i in range(10):             self.grid.append([])             for j in range(4):                 temp = Square(i,j, "sideboard")                 self.grid[i].append(temp)                 self.add_widget(temp)                 temp.bind(on_occupied = self.do_a_thing)       def do_a_thing(self):         for square in self.children:             #do a thing  class Square(Button):     def __init__(self, row, col, type):         self.row = row         self.col = col         self.id = str(self.row) + "," + str(self.col)         self.type = type         self.occupied = BooleanProperty(False)         super().__init__() 

My goal is to bind the "do_a_thing" method to be called each time the value of the square's "occupied" property changes. Because the Square class is used elsewhere in my app, I don't want to set the callback for on_occupied in the kivy language, and I was hoping to avoid creating a Square sub-class just to change the one binding.

When I run my code, it throws no errors, and I've verified that the "occupied" property does actually change. But the "do_a_thing" method never gets fired. Can anyone tell me what I'm doing wrong?

</div
        
       
       

回答リスト

2
 
vote
vote
ベストアンサー
 

プロパティ my_property の場合、変更イベントは my_property と呼ばれます。コールバックは、2つの引数を受け取ります。イベントを解凍したインスタンス、 ドキュメントの新しい値の新しい値。また、クラスに on_ <コード> databaseError.getMessage()0 というメソッドがある場合は、これも呼び出されます。 これは私のために働く自己完全な例です:

<事前> <コード> databaseError.getMessage()1
 

Note that for a property my_property, the change event is called my_property as well. The callback receives two arguments: instance that fired the event, and new value of the property, as shown in the docs. Also, if the class has a method called on_propertyname, this will be called as well. Here is a self-contained example that works for me:

from kivy.app import App from kivy.lang import Builder from kivy.uix.gridlayout import GridLayout from kivy.uix.button import Button from kivy.properties import BooleanProperty  class Board(GridLayout):     def __init__(self, **kwargs):         super(Board, self).__init__(**kwargs)         for i in range(10):             self.add_widget(Square())         for square in self.children:             print square             square.bind(occupied=self.do_a_thing)      def do_a_thing(self, *args):         print "hello from {}, new state: {}".format(*args)         for square in self.children:             pass             #do a thing  class Square(Button):      occupied = BooleanProperty(False)      def on_occupied(self, *args):          print "Callback defined in class: from {} state {}".format(*args)   class mApp(App):     def build(self):         return Builder.load_string(""" Board:     cols: 4     rows: 3 <Square>:     on_press: self.occupied = ~self.occupied """) mApp().run() 
</div
 
 
         
         

関連する質問

0  Kivy:テキストが長すぎるとラベルが黒表示されます  ( Kivy labels are blacked out when text is too long ) 
このスクロール可能なラベルを持っていますが、テキストが長すぎると黒い矩形として表示されます(上部の印刷画面)。ラベルの中のテキストの約半分を削除すると、予想どおり表示されます(下の印刷画面) この修復方法は? <事前> <コード> import kivy ...

1  ImportError:TinyDBという名前のモジュールなし  ( Importerror no module named tinydb ) 
<コード> Select UserID, UserName From Users Where Contains([UserName], '%Ja%') 9 を使用してTinyDBモジュールをインポートしています。 PythonとKivyコードをテストするとき...

0  kvファイルのMDDataTable  ( Mddatatable in kv file ) 
kivymd MDDataTable コンポーネントを、.kvファイルの画面への子ウィジェットとして追加するトラブルがあります。 KeyError: 'container' および<コード> AttributeError: 'super' object ...

1  Pythonでは、.kvの子widgetsを動的に追加します  ( Dynamically adding kv childwidgets in python ) 
Python内の別の(グリッド)レイアウトウィジェット内でラベル(この場合はlightlとdarkl)を動的に追加しようとしています。 IDを使用しようとしましたが、ADD_WIDGETを使用して実装する方法がわかりません。 ChildLabelsにはBa...

0  位置としての可変関数  ( Variable function as position ) 
ボタンの位置をリストのインデックスに関連付けることを試みています。私は多くの名前を含むリストと、数値の数値を多数含むリストに1つあります。ボタンの位置(または他のパラメータ)を取り、そのボタン位置をリストのインデックスに関連付ける関数を作成します。 例:最初...

1  kivyスクリーンにウィジェットを追加します  ( Kivy adding widget to a screen ) 
これは愚かな質問のようです。しかし、私はGameScreenというスクリーンに追加したいウィジェットがあります。 これは私のPythonコードです: <事前> <コード> class WelcomeScreen(Screen): pass clas...

1  Python / KivyのAndroid API  ( Android api with python kivy ) 
こんにちは大学のために私はPythonとKivyのAndroidアプリを書いてみてください。 現時点ではTestDataですべてを実行しますが、可能であれば実データを使用したいです。 だから私の質問は: Android携帯電話ですべてのインストールされているア...

1  タブの異なる「反復」を持つKivymd動的タブ管理  ( Kivymd dynamic tab management with different iterations of tabs ) 
「動的タブ管理」についてKivymd文書からコードを使用して、ユーザーはタブを追加/削除できます。ただし、作成されたこれらのタブのそれぞれは明らかに同じであり、したがって私が置くウィジェットもあります。これは、 Tab 3 から言われたウィジェットのIDを取得...

2  `'NoneType'オブジェクトに属性がないのはなぜ.kvファイルに属性がありませんか?  ( Why am i getting nonetype object has no attribute in kv file ) 
簡易<コード> .kv file: <事前> <コード> <GameWorld>: player: the_player canvas: Rectangle: pos: 5, root.top - 2...

0  キビ:BoxLayoutがボタンを下に押すのはなぜですか。  ( Kivy why is boxlayout pushing my button to the bottom ) 
私はキビに新しいですが、それをハングアップしようとしています。テンプレートとしての「kivyでアプリを作成する」の例で働いていますが、最初の章でもつまずいた。何らかの理由で、私のボタンはアプリの下部にプッシュされています。私は彼らがそこに上がっていることが批判...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有