使用wxPython-Phoenix时控件不显示问题求助
解决wxPython-Phoenix中控件无法显示的问题
嘿,我帮你定位到问题啦!你的控件之所以不显示,核心原因是把布局sizer绑定给了Frame,而非承载所有控件的Panel。所有的静态文本和输入框都放在main_Panel里,sizer必须作用于这个Panel才能让控件正确渲染和布局。
修正后的代码
import wx class App_Frame(wx.Frame): def __init__(self,title=""): # 初始化Frame(用更规范的继承写法) super().__init__(None, -1, title) main_Panel = wx.Panel(self) #-----------Controls------------ # Deal Name Deal_Name_Lbl = wx.StaticText(main_Panel,-1,"Deal Name:",style=wx.ALIGN_CENTER) Deal_Name_Txt = wx.TextCtrl(main_Panel,-1,"Deal Name") # Num Copies Num_Copies_lbl = wx.StaticText(main_Panel,-1,"Number of Copies:",style=wx.ALIGN_CENTER) Num_Copies_Txt = wx.TextCtrl(main_Panel,-1,"Num Copies") #--------------Sizer-------------- flex_grid_sizer = wx.FlexGridSizer(cols=2,vgap=6,hgap=6) flex_grid_sizer.AddGrowableCol(1) # 添加控件到sizer flex_grid_sizer.Add(Deal_Name_Lbl,0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) flex_grid_sizer.Add(Deal_Name_Txt,0,wx.EXPAND) flex_grid_sizer.Add(Num_Copies_lbl,0,wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) flex_grid_sizer.Add(Num_Copies_Txt,0,wx.EXPAND) # 关键修改:把sizer绑定给Panel,而非Frame main_Panel.SetSizer(flex_grid_sizer) # 让Panel先适配内部控件,再让Frame适配Panel尺寸 main_Panel.Fit() self.Fit() class App_(wx.App): def OnInit(self): Main_Frame = App_Frame("Paper") Main_Frame.Show() return True #--------------------- MAIN FUNCTION ---------------------- def Main(): Main_Window = App_() Main_Window.MainLoop() #--- Call of Main---- Main()
主要修改点说明
- 修正sizer绑定对象:将
self.SetSizer(flex_grid_sizer)替换为main_Panel.SetSizer(flex_grid_sizer),因为所有控件都属于main_Panel,sizer必须作用于这个父容器才能管理子控件布局。 - 优化初始化逻辑:用
super().__init__(...)替代原有的wx.Frame.__init__(self,...),这是Python类继承更规范的写法,避免潜在的初始化冲突。 - 调整适配顺序:先让Panel适配内部控件大小,再让Frame适配Panel的最终尺寸,确保布局完整生效。
这样修改后,你的控件就能正常显示,FlexGridSizer的布局也会按预期工作啦!
内容的提问来源于stack exchange,提问作者Andy




