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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

2回答

9753閲覧

[kivy][python]kivyファイルを複数使いたい

night9071

総合スコア13

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2017/11/01 06:08

###前提・実現したいこと
今、kivyファイルを1枚で作ってます。
ScreenManagerで画面切り替えをできるようにしています。
test.kvの中身が増えてきて、ごちゃごちゃしてきたので画面の処理ごとにkvファイルを作りたいと思ってます。
サイトのソースをそのままコピーしてみましたが、エラーが発生しました。

kivyのバージョンが違うのでしょうか?

イメージ説明

サイト名:Qiita 項目:Python Kivy で外部KvファイルをIncludeして使用する

######main.py(サイトのソース)

python

1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3from kivy.properties import ObjectProperty 4 5class RootWidget(BoxLayout): 6 button_include = ObjectProperty() 7 8 def print_obj(self, obj): 9 print(obj) 10 11 def check_button_include(self): 12 print(self.button_include) 13 14class TestApp(App): 15 def build(self): 16 return RootWidget() 17 18if __name__ == '__main__': 19 TestApp().run()

######test.kv(サイトのソース)

python

1#:include gui/tab_test.kv 2<RootWidget>: 3 button_include: tab_button_include.button_include 4 5 TabbedPanel: 6 do_default_tab: False 7 8 TabbedPanelItem: 9 text: 'Tab1' 10 BoxLayout: 11 Button: 12 text: 'button 1' 13 on_press: root.print_obj(self) 14 Button: 15 text: 'button 2' 16 on_press: root.check_button_include() 17 TabbedPanelItem: 18 text: 'Tab2' 19 ButtonInclude: 20 id: tab_button_include

######gui/tab_test.kv(サイトのソース)

python

1<ButtonInclude@Button>: 2 button_include: button_include 3 4 id: button_include 5 text: 'button include' 6 on_press: app.root.print_obj(self)

######main.py(私のソース)

python

1# -*- coding: utf-8 -*- 2import kivy 3kivy.require('1.7.3') 4from kivy.lang import Builder 5from kivy.app import App 6from kivy.uix.boxlayout import BoxLayout 7from kivy.uix.widget import Widget 8from kivy.core.window import Window 9from kivy.properties import StringProperty,ListProperty 10Window.clearcolor=[0.999,0.89,0.999,1] 11 12import csv 13import codecs 14 15import sys 16from kivy.core.text import LabelBase, DEFAULT_FONT 17from kivy.resources import resource_add_path 18 19# デフォルトに使用するフォントを変更する 20resource_add_path('./fonts') 21LabelBase.register(DEFAULT_FONT, 'mplus-2c-regular.ttf') #日本語が使用できるように日本語フォントを指定する 22 23class TextWidget(BoxLayout): 24 text = StringProperty() 25 def __init__(self, **kwargs): 26 super(TextWidget, self).__init__(**kwargs) 27 self.text = 'Good' 28 def buttonClicked(self): 29 self.text=self.ids["text_box"].text 30 self.text2=self.ids["text_box2"].text 31 word=[[self.text,self.text2]] 32 f = codecs.open('sample.csv',"a","utf-8") 33 writer = csv.writer(f) 34 #writer.writerow(self.text) 35 writer.writerows(word) 36 37 f.close 38 def buttonClicked2(self): 39 f = codecs.open('sample.csv',"r","utf-8") 40 reader = csv.reader(f) 41 for row in reader: 42 print(row[0] + " " + row[1]) 43 f.close() 44 45 def buttonClicked_tops(self): 46 pass 47 def buttonClicked_bottoms(self): 48 bird = Bird() 49 self.add_widget(bird) 50 def buttonClicked_autor(self): 51 pass 52 53class TestApp(App): 54 def __init__(self, **kwargs): 55 super(TestApp, self).__init__(**kwargs) 56 self.title = 'Apomol' 57 reload(sys) 58 sys.setdefaultencoding('utf-8') 59 Builder.load_file('main.kv') 60 def build(self): 61 return TextWidget() 62 63 64if __name__ == '__main__': 65 TestApp().run()

#####test.py

TextWidget: # ルートに追加 <TextWidget>: orientation: 'vertical' ScreenManager: size_hint_y: 0.7 id: scrmgr Screen: name: 'top' Screen: #ここの中身を別kvにしたい name: 'main1' BoxLayout: orientation:'vertical' size:root.size Label: id:label2 font_size:20 text:'Select the type' color:[0.2,0.2,0.2,1] BoxLayout: Label: size: 50,50 size_hint: None, None Button: text:"トップス" size: 150,150 size_hint: None, None Image: source: "bird.png" center_x: self.parent.center_x center_y: self.parent.center_y Button: size: 150,150 size_hint: None, None Image: source: "bird.png" center_x: self.parent.center_x center_y: self.parent.center_y Button: id:button_bottoms text:"bottoms" size_hint_y:0.3 on_press:scrmgr.current = 'bottoms' Button: id:button_autor text:"autor" size_hint_y:0.3 on_press:scrmgr.current = 'autor' Screen: #ここの中身を別kvにしたい name: 'main2' BoxLayout: orientation:'vertical' size:root.size Label: id:label1 font_size:20 text:"洋服の登録をします" color:[0.2,0.2,0.2,1] BoxLayout: TextInput: id:text_box focus:True text:"名前" on_text_validate:root.buttonClicked() TextInput: id:text_box2 focus:True text:"色" on_text_validate:root.buttonClicked() Label: id:label_pass1 Label: id:label_pass11 BoxLayout: Label: id:label_pass1 Button: id:button1 text:"登録" size_hint_x:1 size_hint_y:1 on_press:root.buttonClicked() Label: id:label_pass2 Button: id:button2 text:"表示" size_hint_x:1 size_hint_y:1 on_press:root.buttonClicked2() Label: id:label_pass3 Screen: #main1から派生するScreen name: 'tops' BoxLayout: orientation:'vertical' BoxLayout: Button: id:back_tops Image: source: "bird.png" BoxLayout: Button: id:back_tops text:'back' size_hint_x:1 on_press:scrmgr.current = 'main1' Screen: #main1から派生するScreen name: 'bottoms' Screen: #main1から派生するScreen name: 'autor' BoxLayout: size_hint_y: 0.1 padding: 10,10,20, 10 Button: text: "top" font_size: 20 on_press: scrmgr.current = 'top' Button: text: "main1" font_size: 20 on_press: scrmgr.current = 'main1' Button: text: "main2" font_size: 20 on_press: scrmgr.current = 'main2'

###補足情報(言語/FW/ツール等のバージョンなど)
python2.7
kivy

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

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

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

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

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

guest

回答2

0

ベストアンサー

コメントだとMarkdownが使えないのでこちらに書きますね

スクリーンが重なっている、ということでしょうか?

screen1.kvには"class rule"しか無いため、Builder.load_file()がNoneを返しています。
"class rule"と"root rule"の違いに関しては記事を書いたことがあるので良かったら参考にしてください。

私が上で挙げたやり方はScreenの派生classを作らない場合のお薦めです。もしMain1Screenという派生classを新たに作るのなら、Builder.load_string()を使ってMain1Screenに関するpythonコードとkvコードを一つのファイルにまとめるのをお薦めします。

方法1 (Screenの派生classが要らない場合のお薦め)

main.kv

text

1<TextWidget>: 2 ScreenManager: 3 id: scrmgr 4 Screen: 5 name: 'top' 6 BoxLayout:

main1screen.kv

text

1Screen: 2 name: 'main1'

main2screen.kv

text

1Screen: 2 name: 'main2'

main.py

python

1class TestApp(App): 2 def build(self): 3 root = TextWidget() 4 scrmgr = root.ids.scrmgr 5 scrmgr.add_widget(Builder.load_file('main1screen.kv')) 6 scrmgr.add_widget(Builder.load_file('main2screen.kv')) 7 return root

方法2 (Screenの派生classを作る場合のお薦め)

main.kvは方法1と同じ

main1screen.py

python

1class Main1Screen(Screen): 2 pass 3 4Builder.load_string(r''' 5<Main1Screen>: 6 name: 'main1' 7''')

main2screen.py

python

1class Main2Screen(Screen): 2 pass 3 4Builder.load_string(r''' 5<Main2Screen>: 6 name: 'main2' 7''')

main.py

python

1from main1screen import Main1Screen 2from main2screen import Main2Screen 3 4class TestApp(App): 5 def build(self): 6 root = TextWidget() 7 scrmgr = root.ids.scrmgr 8 scrmgr.add_widget(Main1Screen()) 9 scrmgr.add_widget(Main2Screen()) 10 return root

ややこしいですが

"class rule"と"root rule"の違いはややこしいので気をつけて。例えばオリジナルのmain.kvにはTextWidgetの"root rule"があるにも関わらずBuilder.load_file('main.kv')の戻り値を誰も受け取っていない為、TextWidgetのインスタンスを作ってすぐに捨てている事になります。またそもそもTestApp.build()内でTextWidgetのインスタンスを作っているのでmain.kv内の"root rule"は要りません。

後質問とは関係無いところですが
Buttonに画像を表示させたいなら以下のプロパティに
background_normal
background_down
background_disabled_normal
background_disabled_normal
画像ファイル名を入れるという手もありますよ

投稿2017/11/02 06:20

gottadiveintopy

総合スコア736

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

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

night9071

2017/11/02 06:59

回答ありがとうございます プログラム内容を省略した状態で「Screenの派生classが要らない場合」をテストしてみたところ、今のところエラーなく動いています。 これから中身を付け加えていきたいと思います ありがとうございます。
night9071

2017/11/20 07:19

この間はありがとうございました。 Button操作が多いため、.pyを分けてBuilder.load_stringを使うことにしました。 現在、画面を行き来したいのですが、戻る際のimportがうまく作動しません。 別質問を作成したので、お時間がありましたら回答していただけると嬉しいです。 よろしくお願いします。 URL:https://teratail.com/questions/101254?modal=q-comp
guest

0

test.py(おそらくmain.kvの間違いだと思いますが)には参考サイトに書かれていた

#:include gui/tab_test.kv

が書かれていないのが原因かと。

Kvファイルの分割ですが、分割は良いことだと思いますがincludeによる取り込みはする必要がないのではと思います。例えば

python

1screenmanager = ScreenManager() 2screenmanager.add_widget(Builder.load_file('screen1.kv')) 3screenmanager.add_widget(Builder.load_file('screen2.kv')) 4screenmanager.add_widget(Builder.load_file('screen3.kv'))

とするとか。

投稿2017/11/02 01:38

gottadiveintopy

総合スコア736

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

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

night9071

2017/11/02 03:48

回答ありがとうございます。 早速、「ButtonClicked_bottoms」の部分に ***main.py*** def buttonClicked_bottoms(self): screenmanager = ScreenManager() screenmanager.add_widget(Builder.load_file('screen1.kv')) ****** ***screen1.kv*** <Main1Screen>: BoxLayout: Button: text: 'My settings button' Button: text: 'Goto Main2' on_press: root.manager.current = 'main2' ****** と入力し、GUI上のBottomsボタンを押すと ***ターミナル*** screenmanager.add_widget(Builder.load_file('screen1.kv')) File "/Library/Python/2.7/site-packages/kivy/uix/screenmanager.py", line 978, in add_widget 'ScreenManager accepts only Screen widget.') kivy.uix.screenmanager.ScreenManagerException: ScreenManager accepts only Screen widget. ****** とエラーが発生しました。 スクリーンが重なっている、ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問