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

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

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

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

Python

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

Q&A

0回答

841閲覧

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

hiro04kon

総合スコア46

再帰

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

Python

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

0グッド

0クリップ

投稿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でもできそうな気もしますが、どちらの方がベターなんでしょうか?
分かりにくいかもしれませんが、よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問