質問編集履歴
2
改訂版
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
コードの簡略化
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
|
-
|
18
|
+
#エクセルファイル名
|
19
|
+
file = ["a","b","c"]
|
20
|
-
|
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):
|
27
|
+
class CustomSpinner(Spinner):
|
47
|
-
global excels_file
|
48
28
|
text = StringProperty()
|
49
|
-
values =
|
29
|
+
values = file
|
50
30
|
pass
|
51
31
|
|
52
|
-
class CustomSpinner2(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
|
-
|
43
|
+
global report
|
67
|
-
self.
|
44
|
+
self.report = text
|
68
|
-
|
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.
|
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:
|