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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

Q&A

解決済

1回答

972閲覧

Pythonで2つのファイルを一つの画面で表示したい

hiro04kon

総合スコア46

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

1グッド

0クリップ

投稿2021/07/07 03:07

編集2021/07/07 03:08

###やりたいこと,困っていること
一度作ったものを一からkivyで作り直し中の、勉強中の者です。
簡単に言うと、classで定義したものを、画面に追加する方法が分かりません。
イメージ説明
この2つのものを、左の図の下に、右の図がくるようにしたいのです。(右の図は、動的に変わります。)
最終的には、kivyのAccordion等で、切り替えたいと思うのですが、ネットで調べてもボタンをkvファイルに書いて表示するものはありますが、そこに複雑なもの(動的に変わるもの)を表示する方法が分かりません。
1つのファイルに、書きたいと思っています。ご助力お願いします。

以下に、メインのpy,kvファイル、それから追加したいpyファイルのコードを簡単に記述します。
Main.pyの内容

python

1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3from kivy.uix.textinput import TextInput 4from kivy.uix.button import Button 5from kivy.uix.label import Label 6from kivy.uix.widget import Widget 7from kivy.uix.spinner import Spinner 8from kivy.properties import StringProperty 9import japanize_kivy 10 11class CustomSpinner(Spinner): 12 pass 13 14class TextWidget(Widget): 15 text = StringProperty() 16 17 def on_spinner_change(self, text): 18 print('The spinner', self, 'have text', text) 19 20 def __init__(self, **kwargs): 21 super(TextWidget , self).__init__(**kwargs) 22 self.text = '新しい提出物 ' 23 24 def on_enter(self, **kwargs): 25 print(self.text) 26 27 def buttonClicked(self, **kwargs ): 28 print("pressed[%s]" % (self.text)) 29 30 def delbuttonClicked(self, **kwargs ): 31 print("pressed[%s]" % (self.text)) 32 33 34class MainApp(App): 35 def __init__(self, **kwargs): 36 super(TeisyutuApp, self).__init__(**kwargs) 37 self.title = '提出物チェック表!' 38 39 def build(self): 40 return TextWidget() 41 42 43if __name__ == "__main__": 44 MainApp().run()

kvファイル

kivy

1<TextWidget>: 2 BoxLayout: 3 orientation: 'vertical' 4 size: root.size 5 6 BoxLayout: 7 size_hint_y: 0.08 8 CustomSpinner: 9 text: '選択' 10 values: 'Home', 'Work', 'Other', 'Custom' 11 size_hint: 0.3 , 1 12 pos_hint: {'center_x': .5, 'center_y': .5} 13 on_text: root.on_spinner_change(self.text) 14 15 Label: 16 id: label1 17 size_hint: 0.3 , 1 18 pos_hint: {'center_x': .3, 'center_y': .5} 19 font_size: 14 20 text: "←エクセルファイルを選択" 21 Widget: 22 size_hint_x: 0.2 23 Button: 24 id: button1 25 size_hint: 0.2, 1 26 text: "削除!" 27 font_size: 14 28 on_press: root.delbuttonClicked() # ボタンをクリックした時にpython側の関数を呼ぶ 29 30 BoxLayout: 31 size_hint_y: 0.08 32 Widget: 33 size_hint: 0.05 , 1 34 35 # ラベル 36 Label: 37 id: label2 38 size_hint: 0.3 , 1 39 font_size: 14 40 text: root.text # root(TextWidget)の変数テキストの値を取得 41 42 TextInput: 43 id: textinput 44 size_hint: 0.4, 1 45 text: "新しい提出物名" 46 font_size: 14 47 multiline: False 48 49 50 Button: 51 id: button2 52 size_hint: 0.2, 1 53 text: "追加!" 54 font_size: 14 55 on_press: root.buttonClicked() # ボタンをクリックした時にpython側の関数を呼ぶ 56 57 Widget: 58 59 BoxLayout: 60 size_hint_y: 0.8

そして、追加したいpyファイル

python

1from kivy.app import App 2from kivy.uix.gridlayout import GridLayout 3from kivy.uix.button import Button 4 5 6####定義変数#### 7yoko = 5 #横の値 8tate = 6 #縦の値 9 10class Zaseki(App): 11 12 def build(self): ###座席票作成プログラム### 13 self.title = 'チェック表' 14 layout = GridLayout(cols = yoko) 15 self.buttons = [] 16 id = 0 17 for i in range(tate): 18 for j in range(yoko): 19 id += 1 20 button = Button(text=str(id),font_size ="20sp",color =( .3 , 0 , 0 , 1 ),background_color =( 1 , 2.5 , 2 , 1 ), on_press=self.buttonClicked) 21 button.my_id = str(id) 22 layout.add_widget(button) 23# layout.add_widget(Button(text=str(id),on_press = lambda instance , n = id : self.buttonClicked(instance,n))) 24 25 print(self.buttons) 26 return layout 27 28 def buttonClicked(self,instance): ###座席クリック時の動作### 29 print(instance.my_id,"クリックした") 30 instance.disabled = True 31 32if __name__ == "__main__": 33 Zaseki().run()
teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提として、kivy では複数のウィンドウをサポートしていない為、

Module: kivy.core.window より

Core class for creating the default Kivy window. Kivy supports only one window per application: please don’t try to create more than one.

関連: Python Kivyで複数Window起動に関して

実装方法としては、別プロセスで2つのウィンドウを使う方法もありますが、
プログラムが無駄に複雑になるので、1つのウィンドウ内に表示する方向で考えます。


実装方法

  • 「App 単体実行に必要な呼び出し」 と 「Widget 再利用したい部分」に別ける。

 ※ ウィンドウのタイトルは2重に出来ません。
見出し表記が必要な場合は、ウィンドウ内に独自にヘッダーを設けます。

  • Main.py から Widget の派生クラスを import
  • KV ファイルに Zaseki: cols: 5 を記述
  • 必要に応じて、レイアウト調整。添付画像はsize_hint_y: 0.2

動的に後から追加したい場合は、

  • KV ファイルで配置する場所だけ確保しておき、MainのApp側からは

 self.root.ids.xxx.add_widget(your_widget) で動的に追加
※ xxx の部分、参照方法は KV 側で適切に設定する。

同時に並べて表示なら、目的の挙動ではないかもしれませんが、
切り替えるなら、ScreenManager も候補。


kv ファイル (差分のみ) 表示したい場所に配置

diff

1 BoxLayout: 2- size_hint_y: 0.8 3+ size_hint_y: 0.2 4+ 5+ Zaseki: 6+ cols: 5

Main.py ファイル (差分のみ) ウィジェット/レイアウトのクラスを import

diff

1+ from zaseki import Zaseki

追加したい py ファイル (クラス変更点) 仮でファイル名zaseki.py とします

  • GridLayout を継承し、それに合わせてコード内部も変更。

python

1from kivy.app import App 2from kivy.uix.gridlayout import GridLayout 3 4class Zaseki(GridLayout): 5 6 def __init__(self, **kw): ###座席票作成プログラム### 7 super().__init__(**kw) 8 9 options = { 10 "font_size" : "20sp", 11 "color": ( .3 , 0 , 0 , 1 ), 12 "background_color": ( 1 , 2.5 , 2 , 1 ), 13 "on_press": self.buttonClicked, 14 } 15 16 for idx, _ in enumerate(range(tate * yoko), start=1): 17 button = Button(text=f"{idx}", **options) 18 button.my_id = idx 19 self.add_widget(button) 20 21 ... # 略 22 23 24class ZasekiApp(App): 25 def build(self): 26 return Zaseki(cols=yoko)

イメージ説明

投稿2021/07/08 01:13

編集2021/07/08 01:58
teamikl

総合スコア8664

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

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

hiro04kon

2021/07/08 04:39

早速のご回答、それから丁寧な解説、ありがとうございます。 importの仕方、optionの記述等、大変勉強になります。 やりたいことは、そんなに難しくないので、ここから頑張れば、できそうです。 1つのファイルに書くと、ごちゃごちゃしてしまうので、この方法は便利だと思いました。 あとは、ファイル選択毎に、ボタンの配列が変わるようにしたいとおもいます。 まず、自分で勉強してみます。 ありがとうございました!大変助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問