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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

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

Q&A

解決済

1回答

1736閲覧

kivyでButtonをon_releaseした後、3秒後にLabelの値を変えたい

kintarock777

総合スコア34

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

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

0グッド

0クリップ

投稿2020/01/14 14:46

編集2020/01/14 14:53

前提・実現したいこと

デフォルトのlabelの値は'start'です
buttonをon_pressすると、labelの値が'Hello World'になり、
さらにon_releaseをすると、labelの値が''になります。
3秒後にlabelの値が'start'にもどるようにしたいです。

発生している問題・エラーメッセージ

該当のソースコード

from kivy.app import App from kivy.uix.widget import Widget import time from kivy.properties import StringProperty, ListProperty class TextWidget(Widget): text = StringProperty() color = ListProperty([0,0,0,1]) def __init__(self, **kwargs): super(TextWidget, self).__init__(**kwargs) self.text = 'Start' def buttonClicked(self): self.text = 'Hello World' def buttonReleased(self): self.text= '' time.sleep(3) self.text = 'start' class MainApp(App): def __init__(self, **kwargs): super(MainApp, self).__init__(**kwargs) self.title = 'Hello world' def build(self): return TextWidget() if __name__ == '__main__': MainApp().run() # kvファイル TextWidget: <TextWidget> BoxLayout: orientation: 'vertical' size: root.size Label: id: label1 font_size:60 text: root.text color: root.color canvas.before: Color: rgba: 1,1,1,1 Rectangle: pos: self.pos size: self.size Button: id: btn text: 'OK' font_size:50 color: 0,0,0,1 on_press: root.buttonClicked() on_release: root.buttonReleased()

試したこと

time.sleep()関数を使いましたが、うまくいきませんでした。

### 補足情報(FW/ツールのバージョンなど) kivi 1.11.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

Clock.schedule_once()でできます。もし関数の数が増えていくのを嫌うのであればasynckivyというmoduleを使う手もありますね。

投稿2020/01/15 04:34

編集2020/01/15 04:41
gottadiveintopy

総合スコア736

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

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

kintarock777

2020/01/15 14:13

ありがとうございました。 Clock.schedule_once()を使ってできました。 from kivy.clock import Clock def buttonReleased(self): self.event = Clock.schedule_once(self.lclear_start, 3) self.text= '' self.event def lclear_start(self, dt): self.text = 'Start' **************************************** こんな感じでまとまりました。 ただ、三秒以内にbuttonを連打すると、連打した分の def Lclear_start()が、すべてスケジュールされてしまいます。 結果、三秒後からは Label に常に 'start'が残ってしまいます。 連打した場合、最後のクリックのスケジュールだけを残して前のスケジュールをキャンセルする方法はあるでしょうか? cancel()を試してみましたが、正しいコーディングもわからず、 望ましい結果が得られません。 引き続きよろしくお願いいたします。
gottadiveintopy

2020/01/15 14:41

__init()__内でClock.create_trigger()を呼んで返り値を保存しておいて self.event = Clock.create_trigger(...) 後はbuttonが離される度にそれに括弧をつけて呼んであげればできますよ。連打したうちの必ず"最後"を残したいならその前にcancel()も要りますね。 self.event.cancel() self.event() もし最後じゃなくて最初でも構わないのならcancel()は要らないです。
kintarock777

2020/01/16 12:28

回答ありがとうございました。 教えてもらったとおりの方法で、希望の結果が得られました。 self.event = Clock.schedule_once(...)のまま__init__内に移しても、 同じ結果が得られました。 またよろしくお願いいたします。 ありがとうございました。
gottadiveintopy

2020/01/16 13:00

いえいえ。 > self.event = Clock.schedule_once(...)のまま__init__内に移しても、 > 同じ結果が得られました。 それだと多分希望する動作ではないはずです。試しに起動してからbuttonを押さずに放置してみると分かります。 self.event = Clock.schedule_once(...) は self.event = Clock.create_trigger(...) self.event() と同等。
kintarock777

2020/01/20 04:40

回答ありがとうございます。 もう一度試してみました。 class TextWidget(Widget): text = StringProperty() color = ListProperty([0,0,0,1]) def __init__(self, **kwargs): super(TextWidget, self).__init__(**kwargs) self.text = 'Start' self.event = Clock.create_trigger(self.lclear_start, 3) def buttonClicked(self): self.text = 'Hello World' self.event.cancel() def buttonReleased(self): self.text= '' self.event.cancel() self.event() def lclear_start(self, dt): self.text = 'Start' こんな感じです self.event = Clock.create_trigger(self.lclear_start, 3) を、 self.event = Clock.schedule_once(self.lclear_start, 3) にしても、同じ結果に見えます。 連打したり、放置したりいろいろ試してみましたが、違いがわかりません。 どのような操作をすれば違いがわかるのでしょうか? よろしくお願いします。
gottadiveintopy

2020/01/22 08:51

そのcodeだと多分違いは分からないですね。元のcodeのようにbuttonが離された後のLabelの文字列を"Start"ではなく"start"(初期値以外ならなんでも良い)にしてあげれば意図した動作をしていない事が分かると思います。
kintarock777

2020/01/22 12:08

回答ありがとうございます。 動作確認しました。 create_trigger() と schedule_once()の違いが笑っちゃうほどよくわかりました。 またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問