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

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

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

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

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

Q&A

解決済

1回答

1692閲覧

wxpythonで動的にパネルを追加し表示したい

tombo_3

総合スコア2

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

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

1グッド

0クリップ

投稿2021/08/16 02:57

前提・実現したいこと

wxpythonで、Pnael2のボタンイベントに応じ動的にPanel1を追加するプログラムを組んでいるのですが
追加した分のパネルの表示がずれてしまいます。

イメージ説明

該当のソースコード

python

1ソースコード 2 3 4import wx 5import wx.xrc 6 7class MyFrame1 ( wx.Frame ): 8 9 def __init__( self ): 10 wx.Frame.__init__ ( self, None) 11 12 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 13 14 bSizer1 = wx.BoxSizer( wx.HORIZONTAL ) 15 self.bSizer2 = wx.BoxSizer( wx.VERTICAL ) 16 self.bSizer10 = wx.BoxSizer( wx.HORIZONTAL ) 17 self.panel1 = Panel1(self) 18 self.panel1_list = [] 19 self.panel1_list.append(self.panel1) 20 self.bSizer10.Add( self.panel1, 1, wx.EXPAND |wx.ALL, 5 ) 21 self.bSizer2.Add( self.bSizer10, 1, wx.EXPAND |wx.ALL, 5 ) 22 self.panel2 = Panel2(self) 23 self.bSizer2.Add( self.panel2, 1, wx.EXPAND |wx.ALL, 5 ) 24 bSizer1.Add( self.bSizer2, 4, wx.EXPAND, 5 ) 25 26 self.SetSizer( bSizer1 ) 27 self.Layout() 28 29 30 def __del__( self ): 31 pass 32 33 34class Panel1(wx.Panel): 35 def __init__( self, parent ): 36 wx.Panel.__init__( self, parent, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL ) 37 self.parent = parent 38 self.gbSizer3 = wx.GridBagSizer( 0, 0 ) 39 self.gbSizer3.SetFlexibleDirection( wx.BOTH ) 40 self.gbSizer3.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) 41 self.m_staticText8 = wx.StaticText( self, wx.ID_ANY, u"Panel1 ", wx.DefaultPosition, wx.DefaultSize, 0 ) 42 self.m_staticText8.Wrap( -1 ) 43 self.gbSizer3.Add( self.m_staticText8, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) 44 self.button1 = wx.Button( self, wx.ID_ANY, u"+", wx.DefaultPosition, wx.Size( 40,-1 ), 0 ) 45 self.gbSizer3.Add( self.button1, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) 46 self.SetSizer( self.gbSizer3 ) 47 self.Layout() 48 self.gbSizer3.Fit( self ) 49 50class Panel2(wx.Panel): 51 def __init__( self, parent ): 52 wx.Panel.__init__( self, parent, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL ) 53 self.parent = parent 54 self.gbSizer7 = wx.BoxSizer( wx.VERTICAL ) 55 self.m_staticText6 = wx.StaticText( self, wx.ID_ANY, u"Panel2", wx.DefaultPosition, wx.DefaultSize, 0 ) 56 self.m_staticText6.Wrap( -1 ) 57 self.gbSizer7.Add( self.m_staticText6, 0, wx.EXPAND |wx.ALL, 5 ) 58 self.Add_Panel = wx.Button( self, wx.ID_ANY, u"+", wx.DefaultPosition, wx.Size( 40,-1 ), 0 ) 59 self.gbSizer7.Add( self.Add_Panel, 0, wx.EXPAND |wx.ALL, 5 ) 60 self.SetSizer( self.gbSizer7 ) 61 self.Layout() 62 self.gbSizer7.Fit( self ) 63 64 self.Add_Panel.Bind( wx.EVT_BUTTON, self.Add_PanelOnButtonClick ) 65 66 #Panel1追加イベント 67 def Add_PanelOnButtonClick( self, event ): 68 69 self.parent.panel1 = Panel1(self) 70 self.parent.panel1_list.append(self.parent.panel1) 71 self.parent.bSizer10.Add( self.parent.panel1, 1, wx.EXPAND |wx.ALL, 5 ) 72 self.parent.Layout() 73 self.parent.bSizer10.Layout() 74 75 76 77if __name__ == '__main__': 78 app = wx.App() 79 main_win = MyFrame1() 80 main_win.Show() 81 app.MainLoop()

ボタンイベントでのLayout()の対象を上位のSizerに変更してみましたがうまくいきませんでした。
どのように訂正すればうまく表示されるでしょうか。
初学者のためコードに見づらい部分あるかと思いますが、どなたかご指導お願い致します。

teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: ウィジェットの親子関係

最初から表示されている Panel1 は MyFrame1 を親にウィジェットが作られています。
Panel2 のクリックイベントで作られる Panel1 は、Panel2 が親になってます。

横方向の位置・サイズは Horizontal な BoxSizer で管理されてますが、
縦方向はレイアウト管理さない為、親ウィジェットの位置が基準となります。

MyFrame1: bSizer2: BoxSizer bSizer10: BoxSizer Panel1 # 親は MyFrame1 Panel2 Panel1 # XXX: Panel2 を親にして、bSizer10 に Add

解決策: Panel2 クリックイベントで生成する Panel1 の親を変更

diff

1# XXX: self.parent.panel1 を上書きしてしまう 2# XXX: Panel1 の親が Panel2 3- self.parent.panel1 = Panel1(self) 4- self.parent.panel1_list.append(self.parent.panel1) 5 6+ panel1 = Panel1(self.parent) 7+ self.parent.panel1_list.append(panel1) 8

投稿2021/08/16 04:18

teamikl

総合スコア8760

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

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

tombo_3

2021/08/16 04:32

回答ありがとうございます。非常に助かりました。 wxでのレイアウト管理について理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問