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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1501閲覧

python def内のfor文が動かない?

hiro04kon

総合スコア46

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/06/06 03:15

まだまだpython初心者のものです。classやdefなどを使い始めたばかりです。

実現したいこと

複数あるエクセルから、wx.Comboboxを使い、ファイル名を選択します。そのファイルから情報を読み取りたいのですが、
読み取るための定義の中のforが動きません。

###エクセルの中身
イメージ説明

###ソースコード

python3

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3# pip install openpyxl 4 5import wx 6import wx.xrc 7import openpyxl 8import os 9import glob 10 11################ 実行ファイルのパス########## 12dir = os.path.dirname(os.path.abspath(__file__)) 13 14#####フォルダのエクセルファイルをリスト化###### 15excels =glob.glob(dir + '/*.xls*') #xls,xlsxの拡張子のファイルをフルパス付リスト化 16excels.remove(dir + '\meibo.xlsx') #meibo.xlsxを除く 17excels_file =[] 18for e in excels : #meibo.xlsxを除いて、ファイル名のみのリストを作成 19 excels_file.append(e.replace(dir+'\', '')) 20 21 22####定義変数名#### 23kaigi = "" #会議セルの値 24seki = 0 #座席の数 25meibo =[] #名簿 26prognum = [] #プログラム用番号 27report = [] #初期レポート名 28m_comboBox1Choices = report 29m_comboBox0Choices = excels_file 30 31class MyFrame1 ( wx.Frame ): 32 33 def __init__( self, parent ): 34 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = "TEST!! " + kaigi, pos = wx.DefaultPosition, size = wx.Size(800,600 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 35 36 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 37 self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOW ) ) 38 39 bSizer1 = wx.BoxSizer( wx.VERTICAL ) 40 41 #####0列目の項目###### 42 global m_comboBox0 43 bSizer0 = wx.BoxSizer( wx.HORIZONTAL ) 44 self.m_comboBox0 = wx.ComboBox( self, wx.ID_ANY, u"エクセルファイルを選択", wx.DefaultPosition, wx.DefaultSize, excels_file, 0 ) 45 self.m_comboBox0.SetMinSize( wx.Size( 200,-1 ) ) 46 bSizer0.Add( self.m_comboBox0, 0, wx.ALL, 5 ) 47 bSizer1.Add( bSizer0, 0, wx.EXPAND|wx.FIXED_MINSIZE, 1 ) 48 bSizer0 = wx.BoxSizer( wx.VERTICAL ) 49 50 51 #####座席表##### 52 self.mainPanel = wx.Panel(self) 53 self.darea = MyFrame1.ZasekiArea(self.mainPanel) 54 self.SetSizer( bSizer1 ) 55 self.Layout() 56 self.Centre( wx.BOTH ) 57 self.m_comboBox0.Bind(wx.EVT_COMBOBOX, self.excel_change_func ) #コンボボックスを変更時の動作 58 59 def __del__( self ): 60 pass 61 62 #####エクセルファイル選択時の動作##### 63 def excel_change_func(self , event ): 64 col = excels_file.index(self.m_comboBox0.GetStringSelection()) #ボタンが何番目かを取得 65 self.file = excels[col] #エクセルファイルのフルパスをっ取得 66 self.excell_import(self.file) 67 68 #####エクセルから情報を読み取る##### 69 def excell_import (self ,file) : 70 global meibo 71 self.wb = openpyxl.load_workbook(file ,data_only=True,read_only=False) #エクセルファイルを開く 72 self.sheet = self.wb['date'] #シートを選択 73 74 #会議セルの値を取得 75 self.kaigi = self.sheet.cell(1,3).value 76 77 ####座席配列#### 78 self.seki = int(self.sheet.cell(3,6).value) 79 80 ####名簿の情報を取得#### ←ここで情報を読み取りたいが、何も動作していない様子 81 for row in self.sheet['A5:IV'+ str(seki + 4)] : 82 for col in row : 83 meibo.append(col.value) 84 print(meibo) ←空のリストしか表示されない。 85 86 87 class ZasekiArea(wx.Panel): 88 def __init__(self, parent): 89 wx.Panel.__init__(self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size(800,600 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 90 ....... 91 self.mainPanel.SetSizer(sizer) 92 self.mainPanel.Bind(wx.EVT_COMBOBOX , MyFrame1.excel_change_func) 93 94if __name__ == '__main__': 95 app = wx.App(False) 96 frame = MyFrame1(None) 97 frame.Show(True) 98 app.MainLoop()

なぜ、for文が機能しないのか、教えてください。また、どのようにすれば、機能するのか教えてください。
よろしくお願いします。

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

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

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

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

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

meg_

2021/06/06 03:19

row、colの値はデバッグして確かめましたか?
hiro04kon

2021/06/06 11:40

返信、ありがとうございます。 両方とも、空、というか、反応しませんでした…
guest

回答1

0

ベストアンサー

下記にselfが抜けておりグローバルで定義されている方のseki=0として判断されてforループがから配列で抜けているのではないでしょうか?

python

1for row in self.sheet['A5:IV'+ str(seki + 4)] :

下記の形にするといかがでしょうか?

python

1for row in self.sheet['A5:IV'+ str(self.seki + 4)] :

投稿2021/06/06 04:29

m2l

総合スコア318

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

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

hiro04kon

2021/06/06 11:54

すいません!その通りでした!なんたるボンミス… 動きました!ありがとうございました!
m2l

2021/06/06 11:56

定義ミスは中々気付きにくいですよね。。 動いてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問