ポップアップ - Kivy Advent Calendar 2013

(※ビルドの話をしましたが、再びKivyLauncherで出来る範囲での話に戻ります)
5日目の「スライドっぽい...」でも使ったので、今回はポップアップについて解説します。
Kivyの中で、ポップアップに当たるものは次のようなものがあります。

Popup タイトルバーあり / 背景が暗くなる
ModalView タイトルバーなし / 背景が暗くなる
Bubble タイトルバーなし / ふきだし (背景は暗くならない)

元のウィンドウの上にオーバラップして表示され、ヘルプ・エラー・進捗を示すメッセージウィンドウとして、あるいはさまざまな選択を要求するメニューやダイアログ画面として使われます。いずれもイベント処理を追加しなければドラッグで動いたりはせず、ただ表示するだけです。
PopupとModalViewの違いは、タイトルバーがあるかないかだけです。これらは単体でもopen/dismissで表示・非表示ができます。attach_toで親ウィンドウを示すこともできますが、デフォルトで元のウィンドウが暗くなってしまうので、設定画面やウィザードのように、大きく画面を占める使い方が主で、ポップアップメニューのような使い方には適さないと思います(background_colorをアルファ値0にすれば背景を暗くさせないことも可能ですが)。
一方Bubbleは下のウィジェットを暗くすることはせず、またふきだしの向きをつけられるので「ウィジェットに対するアクション選択肢」を示すポップアップメニューとして適したものです。その代わり下のウィジェットが隠れてしまうほど大きく画面を占める使い方には向きません。
Bubbleの代表的なものが、TextInputでテキストがあるところを長押しして表示される「Cut-Copy-Paste」の3ボタンのポップアップです。Bubble自体に表示や非表示にするメソッドはなく、元となるウィジェットへadd_widget、remove_widgetして表示、非表示としていて、ウィジェットへのタップをきっかけに選択肢を開くといった形になります。
以下はBubbleのサンプルで、タッチした座標を出しています。


(/sdcard/kivy/bubbles/)

android.txt
main.py

(main.py)

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.bubble import Bubble

from kivy.lang import Builder
Builder.load_string('''
:
    canvas.before:
        Color:
            rgb: 0.0, 0.2, 0.2, 1
        Rectangle:
            pos: self.pos
            size: self.size
:
    label: _label
    arrow_pos: 'bottom_left'
    size_hint: (None, None)
    size: (200, 50)
    Label:
        id: _label
''')

class Result(Bubble):

    def __init__(self, **kwargs):
        super(Result, self).__init__(**kwargs)
        self.label.text = kwargs['text']

class Bubbles(FloatLayout):

    def on_touch_up(self, touch):
        result = Result(text='(%d, %d)'%touch.pos, pos=touch.pos)
        self.add_widget(result)

class BubblesApp(App):

    def build(self):
        return Bubbles()

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