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

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

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

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

Python

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

Q&A

解決済

2回答

3616閲覧

kivy: コードをどこに書けばいいのかわかりません;_;

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2016/12/01 16:03

環境
kivy1.9.0
python3.5.2

質問内容
とりあえず、コードをば、、、

まずTty.py

python

1# This Python file uses the following encoding: utf-8 2import time 3from kivy.app import App 4from kivy.uix.widget import Widget 5from kivy.config import Config 6from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, SwapTransition 7 8 9 10Config.set('graphics', 'width', '700') 11Config.set('graphics', 'height', '500') 12 13class MenuScreen(Screen): 14 pass 15 16class EntranceScreen(Screen): 17 pass 18 19 20class TtyApp(App): 21 def build(self): 22 self.title = 'Tty' 23 self.icon = 'icon.png' 24 # ScreenManagerのインスタンスもbuild()内で生成 25 sm = ScreenManager(transition = FadeTransition()) 26 sm.add_widget(EntranceScreen(name='EntranceScreen')) 27 sm.add_widget(MenuScreen(name='MenuScreen')) 28 return sm 29 30if __name__ == '__main__': 31 TtyApp().run()

次にTty.kv

#:kivy 1.0.9 <MenuScreen>: Widget: Button: text: 'exit' on_press: root.manager.current = 'EntranceScreen' <EntranceScreen>: Widget: Image: source: 'icon.png' size: 300, 300 pos: 30, 100 opacity: 0.5 Label: id: title text: "Welcome to TERATAIL!" center_x: root.width / 2 center_y: root.height / 2 font_size: 50

(Screenを継承すると相対配置になってしまうため<EntranceScreen>の後にWidgetを入れています。)

これを実行すると、画面中央にWelcome to TERATAIL!と表示されます。

この状態で1秒待ってから、MainScreenに遷移したいのですが、具体的にコードをどうすればいいのか、どこに加えればいいのかがいまいちわかりません。on_hogehogeのように初めから設定されていないイベント(今回なら、1秒後というイベント)はどうやって設定すればいいのかを教えていただきたいです。。。
kivyの初歩的なところでなんども質問してしまってすみません!

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のような感じでいかがですか。
TtyAppのbuild関数と、MyScreenManagerというクラスが変更箇所です。

python

1# This Python file uses the following encoding: utf-8 2import time 3from kivy.app import App 4from kivy.clock import Clock 5from kivy.uix.widget import Widget 6from kivy.config import Config 7from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, SwapTransition 8 9 10Config.set('graphics', 'width', '700') 11Config.set('graphics', 'height', '500') 12 13 14class MenuScreen(Screen): 15 pass 16 17 18class EntranceScreen(Screen): 19 pass 20 21 22class MyScreenManager(ScreenManager): 23 24 def __init__(self, *args, **kwargs): 25 super().__init__(*args, **kwargs) 26 self.add_widget(EntranceScreen(name='EntranceScreen')) 27 self.add_widget(MenuScreen(name='MenuScreen')) 28 29 # 1秒後に、to_mainを呼び出す 30 Clock.schedule_once(self.to_main, 1.0) 31 32 def to_main(self, dt): 33 self.current = 'MenuScreen' 34 35 36class TtyApp(App): 37 38 def build(self): 39 self.title = 'Tty' 40 self.icon = 'icon.png' 41 sm = MyScreenManager(transition=FadeTransition()) 42 return sm 43 44if __name__ == '__main__': 45 TtyApp().run()

毎秒呼び出したい場合は、
Clock.schedule_interval(function, second)
を、1度だけ呼び出す場合は
Clock.schedule_once(function, second)
を使うと良いです。

投稿2016/12/05 05:05

toritoritorina

総合スコア972

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

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

退会済みユーザー

退会済みユーザー

2016/12/05 05:12

ご回答ありがとうございます。実は、既に自力で解決していたのですが、わかりやすい回答がありませんでしたので、ベストアンサーはつけておりませんでした。ごめんなさい。 僕も、MyScreenManagerクラスを作り、add_Widgetをkvファイルを使って書きました。 とても具体的な解説で、更に理解が深まりました。ありがとうございました!まだ理解できない部分が多いため、これからもTERATAILで質問することになるかと思いますが、その時はまたお力添えして頂けると幸いです。
guest

0

(コードではなく方向性についての回答です)

Kivyの場合、時間遅延をさせて別処理させたいときなどには、Clockという仕組みを利用します。

ここがそのドキュメント

基本的には、on_pressイベントの処理時に

  1. Clockを使って、(あらかじめ用意した遷移処理)を1秒後に起動するようにスケジュールを呼び出す
  2. その後に現在のScreenの表示を変える

といった手順で実現できたと思います。

なお、これぐらいの処理になってくると、kvファイル側での記述が(多分)できないので、
例えばEntranceScreenに表示+遷移処理を定義して、ボタンのon_pressではそちらを呼ぶようにした方が良いと思います。

Kivyのイベント処理については、このページに色々と書かれているので、一度読んでみてください

追記

例えば、Widgetが作成されたタイミングに何かさせたい場合は、__init__をオーバーライドするのが一番手っ取り早いです。

python

1 def __init__(self, *args, **kwargs): 2 # 本来の__init__は先行して実行 3 super().__init__(*args, **kwargs) 4 # この後に、追加処理を埋め込む

ただ、これだとWidgetが表示されたタイミングと若干ずれるため、スケジュール時間をちょっと考慮する必要があります。

投稿2016/12/02 04:31

編集2016/12/02 10:39
attakei

総合スコア2738

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

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

退会済みユーザー

退会済みユーザー

2016/12/02 06:09

画面遷移は時間経過でしたい(on_pressではない)ので、EntranceScreenにはボタンは配置してありません。pythonファイルに遷移のコードを書く、というのは分かっているのですが、それをどこから呼べばいいのかが分からないんです.....。兎に角、リンク先を読んでみたいと思います。
attakei

2016/12/02 10:40

あっすみません、質問を誤読していたみたいです。 少し追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問