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

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

ただいまの
回答率

87.92%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 80

score 7

まだまだpython初心者のものです。classの引数で手こずっています。ココの続きです。

やりたいこと

エクセルから名簿の情報を読み取り、それに合わせて座席表を名前付きで動的に配置したいのです。

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

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

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import wx.xrc
import openpyxl
import os
import glob

################ 実行ファイルのパス##########
dir = os.path.dirname(os.path.abspath(__file__))

#####フォルダのエクセルファイルをリスト化######
excels =glob.glob(dir + '/*.xls*')        #xls,xlsxの拡張子のファイルをフルパス付リスト化
excels.remove(dir + '\\meibo.xlsx')     #meibo.xlsxを除く
excels_file =[]
for e in excels :                        #meibo.xlsxを除いて、ファイル名のみのリストを作成
    excels_file.append(e.replace(dir+'\\', ''))

####定義変数####
myclass = ""    #会議セルの値
seki = 0      #座席の数
meibo =[]      #名簿
num =0         #名簿の長さ
prognum = []    #プログラム用番号
no_num =[]        #連番で空いている番号
none_index = []    #名簿の空のセルのインデックス
report = []        #初期レポート名
m_comboBox1Choices = report
m_comboBox0Choices = excels_file

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        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 )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
        self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOW ) )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

    #####0列目の項目######
        global m_comboBox0
        bSizer0 = wx.BoxSizer( wx.HORIZONTAL )
        self.m_comboBox0 = wx.ComboBox( self, wx.ID_ANY, u"エクセルファイルを選択", wx.DefaultPosition, wx.DefaultSize, excels_file, 0 )
        self.m_comboBox0.SetMinSize( wx.Size( 200,-1 ) )
        bSizer0.Add( self.m_comboBox0, 0, wx.ALL, 5 )
        bSizer1.Add( bSizer0, 0, wx.EXPAND|wx.FIXED_MINSIZE, 1 )
        bSizer0 = wx.BoxSizer( wx.VERTICAL )


    #####座席表#####                 ← ここをどのように表現したらいいのでしょうか?
        self.mainPanel = wx.Panel(self)
        self.darea = ZasekiArea(self.mainPanel)

        self.SetSizer( bSizer1 )
        self.Layout()
        ZasekiArea()
        self.Centre( wx.BOTH )

        # Connect Events
        self.m_comboBox0.Bind(wx.EVT_COMBOBOX, self.excel_change_func )  #コンボボックスを変更時の動作

    def __del__( self ):
        pass

    #####エクセルファイル選択時の動作#####
    def excel_change_func(self , event ):
        col = excels_file.index(self.m_comboBox0.GetStringSelection())    #ボタンが何番目かを取得(横列の検索用)
        print("excel_change_func=" ,col , excels_file[col] , excels[col])
        self.file = excels[col]
        self.excell_import(self.file)

        self.check()

    #####選択したエクセルから情報を読み取る######
    def excell_import (self ,file) :
        global meibo ,num
        self.wb = openpyxl.load_workbook(file ,data_only=True,read_only=False)
        self.sheet = self.wb['date']
        #####ファイルへのフルパス#####
        self.wbp = os.path.normpath(file)
        #会議セルの値を取得
        self.myclass = self.sheet.cell(1,3).value

        ####配列####
        self.seki = int(self.sheet.cell(3,6).value)      #座席の数の値を取得(空白の席を含む数)
        num = self.seki
        ####名簿を取得####
        for row in self.sheet['A5:IV'+ str(self.seki + 4)] :
            for col in row :
                meibo.append(col.value)

    #####座席チェック######     全てのボタンでか調べる
    def check(self) :
            for check in range(seki) :        #席の数だけ繰り返す
                label = str(meibo[check][1]) +". "+ str(meibo[check][4]+ '\n' + str( meibo[check][2]) )            #名簿から氏名等を再取得
                if meibo[check][self.col + 6] == None :        #日付が空白なら
                    self.button[check].SetLabel(label)
                    self.button[check].Enable()        #クリック可にする
                else :
                    self.button[check].SetLabel(label + '\n' + str(meibo[check][self.col + 6]))    #提出日付を付与
                    self.button[check].Disable()        #クリック不可にする


class ZasekiArea(wx.Panel):
    def __init__(self, parent):
        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)

        self.mainPanel = wx.Panel(self)
        self.obj_button =[]
        self.button = []
        for i in range( num ) :                #名簿の長さだけ繰り返す
            labeltext = str(meibo[i][1]) +".     "+ str(meibo[i][4]+'\n' + str( meibo[i][2]) )
            self.button.append(wx.Button(self.mainPanel, wx.ID_ANY, labeltext, wx.DefaultPosition, wx.DefaultSize, wx.BU_LEFT ) )

        sizer = wx.GridSizer( 10 , 20 , 5, 10)
        for j in range( num ) :
            sizer.Add(self.button[j],1, flag=wx.EXPAND )
            self.obj_button.append(id(self.button[j]))

        self.mainPanel.SetSizer(sizer)
        self.mainPanel.Bind(wx.EVT_COMBOBOX , MyFrame1.excel_change_func)

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame1(None)
    frame.Show(True)
    app.MainLoop()


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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