はじめに
Python Kivyの使い方② ~電卓を作成する~ - Qiita
を写経しまして画面切り替えは動いたのですが、より理解を深めるために最小構成をゼロから作ってみます。
想定環境
- Windows 10(Pythonでkivyなので他OSでもだいたい同等です)
- Python 3.6.5
- pip 18.0
- kivy 1.10.0
- Nuitka 0.5.30(基本的には出てきませんが、実行ファイル形式出力が可能な状態を維持します)
Pythonコード
基本的には
Python Kivyの使い方② ~電卓を作成する~ - Qiita
のものをベースに使いつつ、拙著
で書いた日本語フォント表示対応を入れてあります。
MacやLinuxではresource_add_pathで読み込むパスとLabelBase.registerで指定するフォント名を変えれば動くと思いますが、筆者未確認です。
main.py
# -*- coding: utf-8 -*
import os
import kivy
from kivy.app import App
from kivy.core.window import Window
from kivy.factory import Factory
from kivy.uix.boxlayout import BoxLayout
# 日本語フォント表示対応
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path
resource_add_path('{}\\{}'.format(os.environ['SYSTEMROOT'], 'Fonts'))
LabelBase.register(DEFAULT_FONT, 'MSGOTHIC.ttc')
# kvファイルを画面ごとに分離してバラで読み込む
from kivy.lang import Builder
Builder.load_file('window1.kv')
Builder.load_file('window2.kv')
class MainRoot(BoxLayout):
window1 = None
window2 = None
def __init__(self, **kwargs):
# 起動時に各画面を作成して使い回す
self.window1 = Factory.Window1()
self.window2 = Factory.Window2()
super(MainRoot, self).__init__(**kwargs)
def change_disp(self):
self.clear_widgets()
self.add_widget(self.window1)
def change_disp2(self):
self.clear_widgets()
self.add_widget(self.window2)
class MainApp(App):
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
self.title = '画面切り替えテスト'
pass
if __name__ == "__main__":
MainApp().run()
kvファイルをバラして読み込んでいるところと、起動時にFactoryで両ウィンドウを作成してしまって、その後は使いまわしているところがポイントです。
kvファイル
main.kv
main.kv
MainRoot
<MainRoot>
Window1
MainRootで読み込むウィジェットを切り替えることで、最初に表示するウィンドウの選択が出来ます。
window1.kv
window1.kv
<Window1@BoxLayout>
orientation: "vertical"
ActionBar:
ActionView:
ActionPrevious:
title: 'ウィンドウ1'
with_previous: False
ActionButton:
text: '切り替え'
on_press: print("change disp window 1"); app.root.change_disp2()
BoxLayout:
Label:
text: '画面1'
window2.kv
window2.kv
<Window2@BoxLayout>
orientation: "vertical"
ActionBar:
ActionView:
ActionPrevious:
title: 'ウィンドウ2'
with_previous: False
ActionButton:
text: '切り替え'
on_press: print("change disp window 2"); app.root.change_disp()
BoxLayout:
Label:
text: '画面2'
kvファイルをバラしてあるので、画面ごとにファイルを作成出来ます。
一つ一つのファイルが小さくて短いので、すっきりしてだいぶ分かりやすいかと思います。