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

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

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

HTMLで用いる<button>タグです。

Python

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

Q&A

解決済

1回答

1894閲覧

python GridSizerのサイズが、更新後小さくなる

hiro04kon

総合スコア46

button

HTMLで用いる<button>タグです。

Python

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

1グッド

0クリップ

投稿2021/06/12 08:39

###実現したいこと
wxpythonで作成したものに、ボタンを複数指定して表示します。
最初は、ボタンを配置するパネルは、自動で最大幅になっているのですが、
更新してボタンを配置後、最小の幅?になってしまいます。(フレームの大きさを変えると、自動で幅いっぱいになります。)
それを解消したいのです。

以下がコードです。

python

1# -*- coding: utf-8 -*- 2 3import wx 4import wx.xrc 5 6button = [] 7########################################################################### 8## Class MyFrame1 9########################################################################### 10 11class MyFrame1 ( wx.Frame ): 12 13 def __init__( self, parent ): 14 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"枠を作ろう", pos = wx.DefaultPosition, size = wx.Size( 687,457 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 15 16 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 17 18 bSizer1 = wx.BoxSizer( wx.VERTICAL ) 19 20 ###1列目### 21 bSizer2 = wx.BoxSizer( wx.HORIZONTAL ) 22 23 self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"縦", wx.DefaultPosition, wx.DefaultSize, 0 ) 24 self.m_staticText1.Wrap( -1 ) 25 26 bSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) 27 28 self.w_textCtrl = wx.TextCtrl( self, wx.ID_ANY, u"縦の数", wx.DefaultPosition, wx.DefaultSize, 0 ) 29 bSizer2.Add( self.w_textCtrl, 0, wx.ALL, 5 ) 30 31 self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"横", wx.DefaultPosition, wx.DefaultSize, 0 ) 32 self.m_staticText2.Wrap( -1 ) 33 34 bSizer2.Add( self.m_staticText2, 0, wx.ALL, 5 ) 35 36 self.h_textCtrl = wx.TextCtrl( self, wx.ID_ANY, u"横の数", wx.DefaultPosition, wx.DefaultSize, 0 ) 37 bSizer2.Add( self.h_textCtrl, 0, wx.ALL, 5 ) 38 39 self.make_button = wx.Button( self, wx.ID_ANY, u"作成", wx.DefaultPosition, wx.DefaultSize, 0 ) 40 bSizer2.Add( self.make_button, 0, wx.ALL, 5 ) 41 42 bSizer1.Add( bSizer2, 0, wx.EXPAND, 5 ) 43 44 ###2列目### ←ここのサイズが更新時に変わっていまう。 45 self.mainPanel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL ) 46 self.mainPanel.SetMinSize( wx.Size( 300,500 ) ) ←ここでサイズを指定しても無視されます。 47 self.mainPanel.Layout() 48 bSizer1.Add( self.mainPanel, 1, wx.EXPAND |wx.ALL, 5 ) 49 50 self.SetSizer( bSizer1 ) 51 self.Layout() 52 self.Centre( wx.BOTH ) 53 54 # Connect Events 55 self.make_button.Bind( wx.EVT_BUTTON, self.make_buttonOnButtonClick ) 56 57 def __del__( self ): 58 pass 59 60 61 # Virtual event handlers, overide them in your derived class 62 def make_buttonOnButtonClick( self, event ): 63 self.button_del() 64 #フォームの値を読み込む 65 tate = int(self.w_textCtrl.GetValue()) 66 yoko = int(self.h_textCtrl.GetValue()) 67 68 obj_button =[] #ボタンID格納用 69 button = [] #ボタン本体 70 for i in range( tate * yoko ) : 71 labeltext = str(i+1) +"番" 72 button.append(wx.Button(self.mainPanel, wx.ID_ANY, labeltext, wx.DefaultPosition, wx.DefaultSize, wx.BU_LEFT ) ) 73 74 gsizer = wx.GridSizer( tate , yoko , 5, 10) 75 for j in range( tate * yoko ) : 76 #座席ボタンの配置 77 button[j].SetFont(wx.Font( 11, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, "MS Pゴシック")) 78 gsizer.Add(button[j],1, flag=wx.EXPAND ) 79 obj_button.append(id(button[j])) 80 print(button[j]) 81 82 self.mainPanel.SetSizer(gsizer) 83 self.SetAutoLayout(True) 84 gsizer.Fit( self.mainPanel ) 85 86 #####ボタンの消去##### 87 def button_del(self): 88 global button 89 for i in button : 90 i.Destroy() 91 92if __name__ == '__main__': 93 app = wx.App(False) 94 frame = MyFrame1(None) 95 frame.Show(True) 96 app.MainLoop()

「def make_buttonOnButtonClick」でサイズを指定しても、同様の結果でした。
ただし、デバックで同関数の最後で一旦止めて、再開すると、最大サイズで表示されます。
よろしくお願いいたします。

teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

diff

1- self.SetAutoLayout(True) 2- gsizer.Fit( self.mainPanel ) 3+ self.Layout()
  • SetAutoLayout(True) は、ウィンドウをリサイズ時に .Layout() を呼び出す設定なので、

 任意のタイミングで調整したい場合は明示的に呼び出します。

  • SetAutoLayout(True) は SetSizer 内で暗黙的に呼ばれてる為、省略可能です。

Fit については、恐らく想定されてる使い方が逆になってると思います

  • self.Layout() ... リサイズ時と同じ挙動、ウィンドウ幅いっぱいに広がる
  • gsizer.Fit( self.mainPanel ) ... mainPanel のサイズを gsizer に合わせます
  • self.mainPanel.Fit() ... MinSize (もしくは、適度なサイズ) に調整されます

参考

Determines whether the Layout function will be called automatically when the window is resized

自動でレイアウトされるのは、リサイズ時。ウィジェット生成時は通知されない。

Tell the sizer to resize the window so that its client area matches the sizer’s minimal size

MinSize を設定した mainPanel は sizer ではなく window 側。

投稿2021/06/12 10:53

編集2021/06/12 11:01
teamikl

総合スコア8664

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

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

hiro04kon

2021/06/12 12:41

ありがとうございます!思い通りの動作になりました! Fitについては、ご指摘の通りです…。 まだまだ勉強不足ですので、これから頑張ります! ご教授いただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問