teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

改訂版

2021/07/20 04:10

投稿

hiro04kon
hiro04kon

スコア46

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,4 @@
1
- ###やりたいこと
1
+ ###やりたいこと(修正後)
2
- 2つあるのですが、まず表題の件について
3
2
  複数のエクセルファイルがあり、どれもA列に番号、B列にリストがあります。
4
3
  Spinnerでエクセルを読み込んだ後、もう1つのSpinnerでリストを選択したいのですが、リストを更新しても、2つめのSpinnerに反映されません。
5
4
  refresh()やその他いろいろ調べましたが、分かりませんでした。
@@ -142,6 +141,5 @@
142
141
  ```
143
142
 
144
143
  コードは以上です。
145
- そして、もう一つ、ボタンをただの四角ではなく、楕円の図にしたいのですが、ただの白い四角にしかなりません。上記のような書き方で、Buttonに図を表示し、その上にテキストを表示することはできるでしょうか??
146
144
 
147
145
  すいませんが、よろしくお願いします。

1

コードの簡略化

2021/07/20 04:09

投稿

hiro04kon
hiro04kon

スコア46

title CHANGED
File without changes
body CHANGED
@@ -15,151 +15,57 @@
15
15
  from kivy.properties import StringProperty
16
16
  import japanize_kivy
17
17
 
18
- import openpyxl
19
- import os
18
+ #エクセルファイル名
19
+ file = ["a","b","c"]
20
- import glob
20
+ report = []
21
+ #reportの内容
22
+ a = ["営業","経営","人事","福利"]
23
+ b = ["社会","公民","歴史"]
24
+ c = ["政治","経済","司法"]
21
25
 
22
- ################ 実行ファイルのパス##########
23
- dir = os.path.dirname(os.path.abspath(__file__))
24
-
25
- #####フォルダのエクセルファイルをリスト化######
26
- excels =glob.glob(dir + '/*.xls*') #xls,xlsxの拡張子のファイルをフルパス付リスト化
27
- excels_file =[]
28
- for e in excels : #ファイル名のみのリストを作成
29
- excels_file.append(e.replace(dir+'\', ''))
30
-
31
- ####定義変数####
32
- myclass = "" #クラスセルの値
33
- yoko = 0 #横の値
34
- tate = 0 #縦の値
35
- seito = 0 #生徒数
36
- seki = 0 #座席の数)
37
- meibo =[] #名簿
38
- num =0 #名簿の長さ
39
- report = [] #初期レポート名
40
- wb = True
41
- wbp = True
42
- sheet = True
43
- button = []
44
-
45
26
  ######################################################################
46
- class CustomSpinner(Spinner): #エクセルファイルを選択するSpinner
27
+ class CustomSpinner(Spinner):
47
- global excels_file
48
28
  text = StringProperty()
49
- values = excels_file
29
+ values = file
50
30
  pass
51
31
 
52
- class CustomSpinner2(Spinner): #選んだエクセル内のリストを選択するSpinner
32
+ class CustomSpinner2(Spinner):
53
- global report
54
33
  text = StringProperty()
55
- values = report '←これが更新されない'
34
+ values = report
56
35
  pass
57
36
 
58
37
  class MainScreen(Screen):
59
- global excels_file,report
60
38
  text = StringProperty()
61
- values = excels_file
62
39
  pass
63
40
 
64
41
  #####エクセルファイル選択時の動作#####
65
42
  def on_spinner_change(self , text ):
66
- col = excels_file.index(text) #ボタンが何番目かを取得(横列の検索用)
43
+ global report
67
- self.file = excels[col]
44
+ self.report = text
68
- self.excell_import(self.file)
45
+ report = eval(self.report)
46
+ return report
69
47
 
70
48
 
71
- #####提出物名変更時の動作#####
72
- def on_spinner_change2(self , text ):
73
- self.ids.csp2.values = report
74
- self.col = report.index(text) #ボタンが何番目かを取得(横列の検索用)
75
- pass
76
-
77
- #####選択したエクセルから情報を取得#####
78
- def excell_import (self ,file) :
79
- global meibo ,myclass,yoko,tate,seito,seki,num,report,wb,wbp,sheet
80
- wb = openpyxl.load_workbook(file ,data_only=True,read_only=False)
81
- sheet = wb['date']
82
- #####ファイルへのフルパス#####
83
- wbp = os.path.normpath(file)
84
-
85
- #クラスセルの値を取得
86
- myclass = sheet.cell(1,3).value
87
-
88
- ####配列####
89
- yoko = int(sheet.cell(1,5).value) #横の値を取得
90
- tate = int(sheet.cell(2,5).value) #縦の値を取得
91
- seito = int(sheet.cell(3,5).value) #生徒数を取得
92
- seki = int(sheet.cell(3,6).value) #座席の数の値を取得(空白の席を含む数)
93
-
94
- ####名簿を取得####
95
- meibo =[]
96
- def get_value_list(cellr):
97
- return([[cell.value for cell in row] for row in cellr])
98
- meibo = get_value_list(sheet['A1:B'+ str(seki)])
99
- num = len(meibo)
100
-
101
- ####初期レポート名を取得####
102
- report_o = []
103
- for rowc in list(sheet.rows)[1] :
104
- report_o.append(rowc.value)
105
-
106
- self.report= list(filter(None, report_o))
107
- del self.report[0] #削除、リストとして使用
108
- report = self.report '←ここでは、更新できていた'
109
-
110
49
  class Manager(ScreenManager):
111
50
  def __init__(self):
112
51
  super(Manager, self).__init__()
113
52
  screen = Screen(name = 'Screen 1')
114
53
  screen.add_widget(MainScreen(name='Screen 1'))
115
-
116
54
  self.add_widget(screen)
117
55
  base=Base('main')
118
56
  self.add_widget(base)
119
57
 
120
- def refresh(self):
121
- self.clear_widgets(screens=[self.get_screen('main')])
122
- base=Base('main')
123
- self.add_widget(base)
124
-
125
58
  class Nav(GridLayout):
126
59
  def __init__(self,sm=None):
127
60
  super(Nav, self).__init__()
128
61
  self.sm = sm
129
62
  self.cols =4
130
- self.size_hint = (1,0.07)
63
+ self.size_hint = (1,0.05)
131
- self.add_widget(Button(text="レイアウトへ", on_release=self.change))
132
- self.add_widget(Button(text="ファイル選択へ", on_release=self.goscreen))
133
- self.add_widget(Label(text = ""))
134
- self.add_widget(Button(text="Quit", on_release=self.quit))
135
- def change(self, btn):
136
- self.sm.current='main'
137
- def quit(self,ins):
138
- exit()
139
- def goscreen(self,ins):
140
- self.sm.current='Screen 1'
141
64
 
142
65
  class Base(Screen):
143
66
  def __init__(self,name):
144
67
  super(Base, self).__init__()
145
- global button
146
- options = {
147
- "font_size" : "14sp",
148
- "color": ( .3 , 0 , 0 , 1 ),
149
- "background_color": ( 1 , 2.5 , 2 , 1 ),
150
- }
151
- self.lay=GridLayout(cols = yoko)
152
- self.lay.spacing=[5,5]
153
- self.name=name
154
68
 
155
- button = [] #ボタン本体
156
- for idx, _ in enumerate(range(seki)):
157
- button = Button(text=f"{idx}", background_normal = 'maru.png',**options)
158
- button.my_id = idx
159
- self.lay.add_widget(button)
160
-
161
- self.add_widget(self.lay)
162
-
163
69
  class Root(BoxLayout):
164
70
  def __init__(self):
165
71
  super(Root, self).__init__()
@@ -169,18 +75,8 @@
169
75
  self.sm = sm # keep a reference for later use
170
76
  self.add_widget(Nav(sm=sm))
171
77
  self.add_widget(sm)
172
- box = BoxLayout(orientation='horizontal',size_hint=(1,0.08))
173
- box.add_widget(Button(text='refresh',on_release=self.refresh))
174
- box.add_widget(Label(text = "time"))
175
- box.add_widget(Button(text='取消!',on_release=self.delbuttonClicked))
176
- self.add_widget(box)
177
78
 
178
- def refresh(self,ins):
179
- self.sm.refresh()
180
79
 
181
- def delbuttonClicked(self, **kwargs ):
182
- self.text = self.ids.textinput.text
183
-
184
80
  class ScreenteiApp(App):
185
81
  def build(App):
186
82
  return Root()
@@ -227,32 +123,9 @@
227
123
  CustomSpinner2:
228
124
  id:csp2
229
125
  text: '選択'
230
- #values: 'Home', 'Work', 'Other', 'Custom'
231
126
  size_hint: 0.5 , 1
232
127
  on_text: root.on_spinner_change2(self.text)
233
128
 
234
- # ラベル
235
- Label:
236
- id: label2
237
- size_hint: 0.3 , 1
238
- font_size: 14
239
- text: "提出物名→"
240
- # 追加入力欄
241
- TextInput:
242
- id: textinput
243
- size_hint: 0.4, 1
244
- #text: "新しい提出物名"
245
- font_size: 12
246
- multiline: False
247
-
248
- # 追加ボタン
249
- Button:
250
- id: button2
251
- size_hint: 0.2, 1
252
- text: "追加!"
253
- font_size: 12
254
- on_press: root.add_buttonClicked() # ボタンをクリックした時にpython側の関数を呼ぶ
255
-
256
129
  Widget:
257
130
 
258
131
  BoxLayout: