2019年1月4日金曜日

開発環境

Kivyプログラミング ―Pythonで作るマルチタッチアプリ― (実践Pythonライブラリー) (原口 和也(著)、久保 幹雄(監修)、朝倉書店)の3(イベントとプロパティ)、3.4(演習問題)、演習3.3の解答を求めてみる。

コード

Python 3

#!/usr/bin/env python3
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.core.text import LabelBase, DEFAULT_FONT

LabelBase.register(DEFAULT_FONT, 'NotoSansCJKjp-Regular.otf')


class MyTextInput(TextInput):
    pass


class MyLabel(Label):
    def __init__(self, *args, **kwargs):
        Label.__init__(self, *args, **kwargs)
        self.text = '-'

    def callback(self, dt):
        self.input_text = self.parent.children[2]


class MyButton(Button):
    def __init__(self, *args, **kwargs):
        Button.__init__(self, *args, **kwargs)
        self.text = '開始'

    def on_press(self):
        self.label, self.button, self.input_text = self.parent.children
        self.disabled_widgets = [self.button, self.input_text]
        try:
            self.count = int(self.input_text.text)
            if self.count < 0:
                raise ValueError()
            for widget in self.disabled_widgets:
                widget.disabled = True
            self.event = Clock.schedule_interval(self.callback, 1)
        except ValueError as err:
            self.label.text = '非負整数を入力して下さい。'
        except Exception as err:
            self.label.text = str(err)

    def callback(self, dt):
        if self.count >= 0:
            self.label.text = str(self.count)
            self.count -= 1
        else:
            self.event.cancel()
            for widget in self.disabled_widgets:
                widget.disabled = False


class SampleApp(App):
    def build(self):
        box_layout = BoxLayout(orientation='vertical')
        text_input = MyTextInput(text='10', size_hint_y=0.05)
        button = MyButton(size_hint_y=0.475)
        label = MyLabel(size_hint_y=0.475)
        widgets = [text_input, button, label]
        for widget in widgets:
            box_layout.add_widget(widget)
        return box_layout


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

入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))

$ python3 sample3.py
[INFO   ] [Logger      ] Record log in /~/.kivy/logs/kivy_19-01-05_19.txt
[INFO   ] [Kivy        ] v1.10.1
[INFO   ] [Python      ] v3.7.1 (default, Oct 21 2018, 09:01:26) 
[Clang 10.0.0 (clang-1000.11.45.2)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_imageio, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
[INFO   ] [GL          ] Backend used <gl>
[INFO   ] [GL          ] OpenGL version <b'2.1 INTEL-12.4.7'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel Inc.'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) Iris(TM) Pro Graphics 6200'>
[INFO   ] [GL          ] OpenGL parsed version: 2, 1
[INFO   ] [GL          ] Shading version <b'1.20'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <16>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [GL          ] NPOT texture support is available
[INFO   ] [Base        ] Start application main loop
[INFO   ] [Base        ] Leaving application in progress...
$

0 コメント:

コメントを投稿