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

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

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

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

Python

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

Q&A

解決済

1回答

2779閲覧

Python+kivy spinnerのリストの更新

hiro04kon

総合スコア46

Kivy

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

Python

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

0グッド

0クリップ

投稿2021/07/19 11:11

編集2021/07/20 04:10

###やりたいこと(修正後)
複数のエクセルファイルがあり、どれもA列に番号、B列にリストがあります。
Spinnerでエクセルを読み込んだ後、もう1つのSpinnerでリストを選択したいのですが、リストを更新しても、2つめのSpinnerに反映されません。
refresh()やその他いろいろ調べましたが、分かりませんでした。
以下がpyファイルのコードです。

python

1from kivy.app import App 2from kivy.uix.screenmanager import ScreenManager, Screen 3from kivy.uix.boxlayout import BoxLayout 4from kivy.uix.gridlayout import GridLayout 5from kivy.uix.button import Button 6from kivy.uix.label import Label 7from kivy.uix.spinner import Spinner 8from kivy.properties import StringProperty 9import japanize_kivy 10 11#エクセルファイル名 12file = ["a","b","c"] 13report = [] 14#reportの内容 15a = ["営業","経営","人事","福利"] 16b = ["社会","公民","歴史"] 17c = ["政治","経済","司法"] 18 19###################################################################### 20class CustomSpinner(Spinner): 21 text = StringProperty() 22 values = file 23 pass 24 25class CustomSpinner2(Spinner): 26 text = StringProperty() 27 values = report 28 pass 29 30class MainScreen(Screen): 31 text = StringProperty() 32 pass 33 34 #####エクセルファイル選択時の動作##### 35 def on_spinner_change(self , text ): 36 global report 37 self.report = text 38 report = eval(self.report) 39 return report 40 41 42class Manager(ScreenManager): 43 def __init__(self): 44 super(Manager, self).__init__() 45 screen = Screen(name = 'Screen 1') 46 screen.add_widget(MainScreen(name='Screen 1')) 47 self.add_widget(screen) 48 base=Base('main') 49 self.add_widget(base) 50 51class Nav(GridLayout): 52 def __init__(self,sm=None): 53 super(Nav, self).__init__() 54 self.sm = sm 55 self.cols =4 56 self.size_hint = (1,0.05) 57 58class Base(Screen): 59 def __init__(self,name): 60 super(Base, self).__init__() 61 62class Root(BoxLayout): 63 def __init__(self): 64 super(Root, self).__init__() 65 66 self.orientation = "vertical" 67 sm = Manager() 68 self.sm = sm # keep a reference for later use 69 self.add_widget(Nav(sm=sm)) 70 self.add_widget(sm) 71 72 73class ScreenteiApp(App): 74 def build(App): 75 return Root() 76 77if __name__ == '__main__': 78 ScreenteiApp().run()

kvファイルです

kv

1#Filename = screentei.kv 2<MainScreen>: 3 BoxLayout: 4 orientation: 'vertical' 5 size: root.size 6 7 BoxLayout: 8 size_hint_y: 0.05 9 BoxLayout: 10 size_hint_y: 0.08 11 CustomSpinner: 12 id:csp1 13 size_hint: 0.3 , 1 14 pos_hint: {'center_x': .5, 'center_y': .5} 15 on_text: root.on_spinner_change(self.text) 16 17 Label: 18 id: label1 19 text: 'ファイルを選択' 20 size_hint: 0.3 , 0.8 21 pos_hint: {'center_x': .3, 'center_y': .5} 22 font_size: 12 23 text: "←エクセルファイルを選択" 24 Widget: 25 size_hint_x: 0.5 26 27 BoxLayout: 28 size_hint_y: 0.05 29 30 BoxLayout: 31 size_hint_y: 0.08 32 Widget: 33 size_hint: 0.05 , 1 34 35 CustomSpinner2: 36 id:csp2 37 text: '選択' 38 size_hint: 0.5 , 1 39 on_text: root.on_spinner_change2(self.text) 40 41 Widget: 42 43 BoxLayout: 44 size_hint_y: 0.7 45 46 Label: 47 id: label3 48 font_size: 14 49 text: "使い方\n こちらを参照 \n ①エクセルファイルを選びます。" 50 text_size: self.size 51 halign: 'left' 52 valign: 'middle' 53

コードは以上です。

すいませんが、よろしくお願いします。

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

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

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

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

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

gottadiveintopy

2021/07/19 21:24

起こっている不具合を再現するための最小限のコードを載せてください。 再現するのにこれだけのwidgetは要らないはずですし、excelファイルの読み込みもkivyとは関係無いので要らないはずです。
hiro04kon

2021/07/20 00:57

なるほど、いろいろ削ったのですが、そうした方がやはりよいですよね。 ありがとうございます。直しますので、しばしお待ちください。
hiro04kon

2021/07/20 04:10

修正しました。ボタンの画像については、解決しましたので、削除しました。 よろしくお願いします。
gottadiveintopy

2021/07/20 13:28

まずCustomSpinnerで text = StringProperty() としてますが、SpinnerはButtonを継承しているので既に text = StringProperty() を持っています。結果としてそのコードが無意味なものになっているので消して下さい。 次に values = file や values = report の部分で、Spinnerを壊してしまっています。Kivyのpropertyに値を入れる時は必ずinstance経由で行わないといけないです。 それで直らなければ以下のようにWidgetの中にSpinnerを一つだけ置いた単純な構成でSpinnerの仕組みを確かめる事から始めてみてください。 Widget:   CustomSpinner: > refresh()やその他いろいろ調べましたが、分かりませんでした。 Spinnerにそんなmethodは見当たらないですよ、公式docを読んでますか? https://kivy.org/doc/master/api-kivy.uix.spinner.html
hiro04kon

2021/07/21 04:52 編集

gottadiveintopyさん、ご返信ありがとうございます。 プログラミング自体、初めてまだ一月ほどなので、書き方や調べ方が分からず、困っていました。 このようなコメントをいただけると、勉強の筋道が持てます。 まず、instanceの勉強をして、チャレンジしてみます。ありがとうございます。
hiro04kon

2021/07/21 04:52

gottadiveintopyさんの思惑通りなのかは分かりませんが、一応、形として機能しました。 コメントを見て、公式docの読み方も少しわかりました。 大変助かりました。ありがとうございました!
gottadiveintopy

2021/07/21 09:56

> プログラミング自体、初めてまだ一月ほどなので、書き方や調べ方が分からず、困っていました。 よく分からない時は公式docや参考書のやり方に沿うようにしてください。例えば今回の class CustomSpinner(Spinner):   values = file ですけど誰もそんなやり方でvaluesに値を入れている人は居ないでしょう?もし何らかの理由があってその書き方を選んだのならその理由も共に載せて欲しいです。じゃないと何がしたいのか分からないので。 > instance経由で行わないといけないです。 この意味なんですけど Spinner.values = ... がclass経由の書き込みで、Kivyのpropertyに対してこのような事をしてはいけません。対して spinner = Spinner(...) spinner.values = ... がinstance経由の書き込みです。Kivyのpropertyへの書き込みは必ずこのやり方か上の公式docに載ってるやり方で行うようにしてください。
hiro04kon

2021/07/21 11:52

再度のアドバイスありがとうございます。 公式docに載っていることと、その他のことを合わせる書き方が、いつも分からず止まってしまいます。 instance経由の意味も、上の書き方で分かったのですが、自分のコードを書き直すときに、kvファイルの修正方法が分からず、止まってしまいます。(いろいろやったけど、失敗に…) 組み合わせの方法を、どのように学ぶか、考えてみます。ありがとうございました。
guest

回答1

0

自己解決

Spinnerの選択肢を、kvファイルに渡し、Spinner1で選んだ後に、Spinner2のUpdateを関数で行うことで解決できました。
以下が、完成したファイルです。

python

1from kivy.app import App 2from kivy.uix.screenmanager import ScreenManager, Screen 3from kivy.uix.boxlayout import BoxLayout 4from kivy.uix.gridlayout import GridLayout 5from kivy.uix.button import Button 6from kivy.uix.label import Label 7from kivy.uix.spinner import Spinner 8from kivy.properties import StringProperty 9import japanize_kivy 10 11#エクセルファイル名 12file = ["a","b","c"] 13report = [] 14#reportの内容 15a = ["営業","経営","人事","福利"] 16b = ["社会","公民","歴史"] 17c = ["政治","経済","司法"] 18report_o = [a,b,c]         #追加 19###################################################################### 20class CustomSpinner(Spinner): 21 pass 22 23class CustomSpinner2(Spinner): 24 pass 25 26class MainScreen(Screen): 27 global file,report 28 csp1file = file          #追加 29 csp2file = report         #追加 30 pass 31 32 #####エクセルファイル選択時の動作##### 33 def on_spinner_change(self , text ): 34 global report , report_o 35 ind =file.index(text)         #追加 36 report=[] 37 report = report_o[ind]        #追加 38 self.updatespinner2() 39 40 41 def updatespinner2(self ):         #追加 42 self.ids.csp2.text = "選択" 43 self.ids.csp2.values = report 44 45 def on_spinner_change2(self , text ): 46 print(text) 47 48 49class Manager(ScreenManager): 50 def __init__(self): 51 super(Manager, self).__init__() 52 screen = Screen(name = 'Screen 1') 53 screen.add_widget(MainScreen(name='Screen 1')) 54 self.add_widget(screen) 55 base=Base('main') 56 self.add_widget(base) 57 58class Nav(GridLayout): 59 def __init__(self,sm=None): 60 super(Nav, self).__init__() 61 self.sm = sm 62 self.cols =4 63 self.size_hint = (1,0.05) 64 65class Base(Screen): 66 def __init__(self,name): 67 super(Base, self).__init__() 68 69class Root(BoxLayout): 70 def __init__(self): 71 super(Root, self).__init__() 72 73 self.orientation = "vertical" 74 sm = Manager() 75 self.sm = sm 76 self.add_widget(Nav(sm=sm)) 77 self.add_widget(sm) 78 79 80class ScreenteiApp(App): 81 def build(App): 82 return Root() 83 84if __name__ == '__main__': 85 ScreenteiApp().run()

kvファイルです

kivy

1#Filename = screentei.kv 2<MainScreen>: 3 BoxLayout: 4 orientation: 'vertical' 5 size: root.size 6 7 BoxLayout: 8 size_hint_y: 0.05 9 BoxLayout: 10 size_hint_y: 0.08 11 CustomSpinner: 12 id:csp1 13 size_hint: 0.3 , 1 14 pos_hint: {'center_x': .5, 'center_y': .5} 15 on_text: root.on_spinner_change(self.text) 16 17 Label: 18 id: label1 19 text: 'ファイルを選択' 20 values: root.csp1file         #追加 21 size_hint: 0.3 , 0.8 22 pos_hint: {'center_x': .3, 'center_y': .5} 23 font_size: 12 24 text: "←エクセルファイルを選択" 25 Widget: 26 size_hint_x: 0.5 27 28 BoxLayout: 29 size_hint_y: 0.05 30 31 BoxLayout: 32 size_hint_y: 0.08 33 Widget: 34 size_hint: 0.05 , 1 35 36 CustomSpinner2: 37 id:csp2 38 text: '選択' 39 values:root.csp2file         #追加 40 size_hint: 0.5 , 1 41 on_text: root.on_spinner_change2(self.text) 42 43 Widget: 44 45 BoxLayout: 46 size_hint_y: 0.7 47 48 Label: 49 id: label3 50 font_size: 14 51 text: "使い方\n こちらを参照 \n ①エクセルファイルを選びます。" 52 text_size: self.size 53 halign: 'left' 54 valign: 'middle'

まだまだ勉強し足りませんね。頑張ります。

投稿2021/07/21 04:50

hiro04kon

総合スコア46

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問