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

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

新規登録して質問してみよう
ただいま回答率
86.02%
再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

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

Q&A

受付中

python 別クラスを用いたwxButtonの再配置の仕方

hiro04kon
hiro04kon

総合スコア43

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

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

0回答

0グッド

0クリップ

612閲覧

投稿2021/06/09 23:36

編集2021/06/11 01:04

まだまだpython初心者のものです。classの引数で手こずっています。ココの続きです。
###やりたいこと
エクセルから名簿の情報を読み取り、それに合わせて座席表を名前付きで動的に配置したいのです。

できないで引っかかっているところは、エクセルファイルを違うものに選択すると、ボタンを消去して、再配置したいのです。

消去の仕方(どのタイミング、どの項?)が分かりません。その書き方だけでもいいので、教えてください。

以下が作成したコードです。(再編集しました)

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import wx 5import wx.xrc 6import openpyxl 7import os 8import glob 9 10################ 実行ファイルのパス########## 11dir = os.path.dirname(os.path.abspath(__file__)) 12 13#####フォルダのエクセルファイルをリスト化###### 14excels =glob.glob(dir + '/*.xls*') #xls,xlsxの拡張子のファイルをフルパス付リスト化 15excels.remove(dir + '\meibo.xlsx') #meibo.xlsxを除く 16excels_file =[] 17for e in excels : #meibo.xlsxを除いて、ファイル名のみのリストを作成 18 excels_file.append(e.replace(dir+'\', '')) 19 20####定義変数#### 21myclass = "" #会議セルの値 22seki = 0   #座席の数 23meibo =[]   #名簿 24num =0  #名簿の長さ 25prognum = [] #プログラム用番号 26no_num =[] #連番で空いている番号 27none_index = [] #名簿の空のセルのインデックス 28report = [] #初期レポート名 29m_comboBox1Choices = report 30m_comboBox0Choices = excels_file 31 32class MyFrame1 ( wx.Frame ): 33 34 def __init__( self, parent ): 35 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = "TEST!! " + myclass, pos = wx.DefaultPosition, size = wx.Size(800,600 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 36 37 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 38 self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOW ) ) 39 40 bSizer1 = wx.BoxSizer( wx.VERTICAL ) 41 42 #####0列目の項目###### 43 global m_comboBox0 44 bSizer0 = wx.BoxSizer( wx.HORIZONTAL ) 45 self.m_comboBox0 = wx.ComboBox( self, wx.ID_ANY, u"エクセルファイルを選択", wx.DefaultPosition, wx.DefaultSize, excels_file, 0 ) 46 self.m_comboBox0.SetMinSize( wx.Size( 200,-1 ) ) 47 bSizer0.Add( self.m_comboBox0, 0, wx.ALL, 5 ) 48 bSizer1.Add( bSizer0, 0, wx.EXPAND|wx.FIXED_MINSIZE, 1 ) 49 bSizer0 = wx.BoxSizer( wx.VERTICAL ) 50 51 52 #####座席表#####                 ← ここをどのように表現したらいいのでしょうか? 53 self.mainPanel = wx.Panel(self) 54 self.darea = ZasekiArea(self.mainPanel) 55 56 self.SetSizer( bSizer1 ) 57 self.Layout() 58 ZasekiArea() 59 self.Centre( wx.BOTH ) 60 61 # Connect Events 62 self.m_comboBox0.Bind(wx.EVT_COMBOBOX, self.excel_change_func ) #コンボボックスを変更時の動作 63 64 def __del__( self ): 65 pass 66 67 #####エクセルファイル選択時の動作##### 68 def excel_change_func(self , event ): 69 col = excels_file.index(self.m_comboBox0.GetStringSelection()) #ボタンが何番目かを取得(横列の検索用) 70 print("excel_change_func=" ,col , excels_file[col] , excels[col]) 71 self.file = excels[col] 72 self.excell_import(self.file) 73 74 self.check() 75 76 #####選択したエクセルから情報を読み取る###### 77 def excell_import (self ,file) : 78 global meibo ,num 79 self.wb = openpyxl.load_workbook(file ,data_only=True,read_only=False) 80 self.sheet = self.wb['date'] 81 #####ファイルへのフルパス##### 82 self.wbp = os.path.normpath(file) 83 #会議セルの値を取得 84 self.myclass = self.sheet.cell(1,3).value 85 86 ####配列#### 87 self.seki = int(self.sheet.cell(3,6).value) #座席の数の値を取得(空白の席を含む数) 88 num = self.seki 89 ####名簿を取得#### 90 for row in self.sheet['A5:IV'+ str(self.seki + 4)] : 91 for col in row : 92 meibo.append(col.value) 93 94 #####座席チェック###### 全てのボタンでか調べる 95 def check(self) : 96 for check in range(seki) : #席の数だけ繰り返す 97 label = str(meibo[check][1]) +". "+ str(meibo[check][4]+ '\n' + str( meibo[check][2]) ) #名簿から氏名等を再取得 98 if meibo[check][self.col + 6] == None : #日付が空白なら 99 self.button[check].SetLabel(label) 100 self.button[check].Enable() #クリック可にする 101 else : 102 self.button[check].SetLabel(label + '\n' + str(meibo[check][self.col + 6])) #提出日付を付与 103 self.button[check].Disable() #クリック不可にする 104 105 106class ZasekiArea(wx.Panel): 107 def __init__(self, parent): 108 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) 109 110 self.mainPanel = wx.Panel(self) 111 self.obj_button =[] 112 self.button = [] 113 for i in range( num ) : #名簿の長さだけ繰り返す 114 labeltext = str(meibo[i][1]) +". "+ str(meibo[i][4]+'\n' + str( meibo[i][2]) ) 115 self.button.append(wx.Button(self.mainPanel, wx.ID_ANY, labeltext, wx.DefaultPosition, wx.DefaultSize, wx.BU_LEFT ) ) 116 117 sizer = wx.GridSizer( 10 , 20 , 5, 10) 118 for j in range( num ) : 119 sizer.Add(self.button[j],1, flag=wx.EXPAND ) 120 self.obj_button.append(id(self.button[j])) 121 122 self.mainPanel.SetSizer(sizer) 123 self.mainPanel.Bind(wx.EVT_COMBOBOX , MyFrame1.excel_change_func) 124 125if __name__ == '__main__': 126 app = wx.App(False) 127 frame = MyFrame1(None) 128 frame.Show(True) 129 app.MainLoop()

実行すると「TypeError: init() missing 1 required positional argument: 'parent'」と出ます。
引数の書き方がよく分かりません。「excell_import」で読み取ったデータを引用するのですが、数が多いです。

また、「ZasekiArea」をclassではなく、defでもできそうな気もしますが、どちらの方がベターなんでしょうか?
分かりにくいかもしれませんが、よろしくお願いします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

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