質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5511閲覧

Python KivyでBoxLayoutにon_pressなどのイベントを付けたい

Equestria

総合スコア27

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/24 10:25

編集2017/10/28 10:02

表題の通りなのですが、Python KivyのBoxLayoutクラスにon_pressなどの通常buttonで使うイベントを付けることは可能でしょうか?
もし可能であれば方法を教えてください。

kv

1BoxLayout: 2 on_press: root.XXX() #BoxLayoutでon_pressするとAttributeエラー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

behaviorを使って足すという方法もありですが、実はBoxLayoutはwidgetクラスを基底クラスにしています。

https://kivy.org/docs/api-kivy.uix.widget.html

ですので「on_touch_down」,「on_touch_up」というイベントが使えるかと思いますので何もしなくても「on_press」相当の事は大体実現できます。

投稿2017/10/25 13:02

dario_okazaki

総合スコア282

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/10/25 13:17 編集

リファレンスをみた際に感じたのですがどのクラスを派生(mix-in)したクラスなのかがわからないように思いました。ソースが手元にないと分からないのは不便ではないかと思ったわけですが、そういうものなのでしょうかね...自分が何か見落としている気がしてちょっと不安になりました。
KSwordOfHaste

2017/10/25 13:53 編集

>質問者さん 言い忘れましたが、自分はdario_okazakiさんの回答の方がよりよいものに思えます。もしよかったらBAをつけかえてください。蛇足ですが、理由は「できるならシンプルな実装がよい」からです。
dario_okazaki

2017/10/25 14:04

個人的な意見をいうとKivyのリファレンスはわかっている人がわかっている人に向けて書いているので実はかなり不親切です。 https://pyky.github.io/kivy-doc-ja/api-kivy.uix.html をみると 「kivy.uix モジュールには、widgetの作成と管理のためのクラスが含まれています」とwidgetクラスの派生であると書いてあります。 個人的な印象ですとKivyのAPIリファレンスは、こういう順番で読んだ方がよいというものがあるような気がしていますが公式では書いていませんのである程度実際に動かして理解するみたいな慣れが必要かと思ってます。 また本来はリファレンス読めば使える機能全部わかるという書き方をしたほうが良いかと思いますが、ソースを追わないと使い方がわからないというものがあるのもまた事実です。kivyはグラフィックあたりは顕著です。リファレンスはあまりちゃんと書かれていないですのでソースをみるか試行錯誤を自分でするしかないようになっています。 Kivyのソースはgithub上ですべて公開されているのと、インストールするとcython系のファイル(.pyx)以外はlocalの /python<バージョン>/Lib/site-packages/kivy はいかにあって、デバッカーなどを使用するとたどれるます。
KSwordOfHaste

2017/10/25 14:16

なるほどよくわかりました。自分はJava APIリファレンスなどは比較的よくできていると思ってますが、それにしたって「書かれていることを読めば機能が把握できるか」と言われるとそうでもないので、おっしゃっているとおりある程度さわってみないとわからないというのもよくあることと思います。 APIリファレンスがそれほど親切ではないという点わかってスッキリしました。 コメントをいただきましてありがとうございました。
Equestria

2017/10/28 10:00

遅くなりました コメント拝見しました こちらのほうが回答がシンプルで私自身も素晴らしい回答だと感じました。 今後、こういった選択肢も考慮しながらプログラムを組んでみます。 >>KSwordOfHasteさん BAの件についてです 私もシンプルなコードなので素晴らしいと思いました。 ですが今回は一番早く解決策を出していただいた方にBAしました。 dario_okazakiさんには申し訳ないですが、BAは付け替え無しでお願いします。
Roger_Moon

2018/11/02 16:58

古い記事ですが追加で大事なことを書き残しておきます。 buttonbehaviorとontouchはどちらも違うものです。 ontouchは座標で計算します。その計算には重なり順が存在しないことが特徴です。 つまり、ontouchオブジェクトが隠れている状態であっても座標さえ合っていればontouchが動作してしまいます。 touchイベントをきちんと分けたい場合はbehaviorを使ったほうが良いです。
gottadiveintopy

2018/11/03 08:29 編集

on_touchは座標が合ってなくても呼ばれますね
guest

0

ベストアンサー

Kivyについて紹介ページやリファレンスを眺めてみたレベルですが、たまたま

https://kivy.org/docs/api-kivy.uix.behaviors.html

というのを見つけました。この説明を読むとKivyのwidgetは外観を決める属性や操作と、振る舞いを独立したクラスとして分離しており、widgetはこの2つのmix-inとなるような設計になっているみたいです。

上のページに例が載ってますが、BoxLayoutへButtonの振る舞い(behavior)をmix-inする例だと以下のような感じに見えました。

まず、pythonで以下のような独自クラスを定義します

python

1class ClickableBoxLayout(ButtonBehavior, BoxLayout): 2 pass

そうすると、このクラスにon_pressメソッドを書けるようになるので、Kv Languageで以下のように書けそうです。

ClickableBoxLayout: on_press: ...

自分は環境がないので実際にやれてませんが、試してみてはいかがでしょうか。

投稿2017/10/25 00:51

編集2017/10/25 04:24
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Equestria

2017/10/25 04:17

回答ありがとうございます! 先ほど頂いたコードとURLをもとに確認しましたらできました! コードでは- from kivy.uix.behaviors import ButtonBehavior class MyEvent(ButtonBehavior, BoxLayout): def on_press(self): print("Many Thx") 上記のような形で一度behaviorからbuttonbehaviorなるものをimportしてから python側に本体を書くことで可能になりました! ありがとうございました。
Equestria

2017/10/28 10:01

この記事についてdario_okazakiさんの回答も大変シンプルでよい回答でした 当記事に行き着いた方はそちらの回答も考慮してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問