2017-02-23 41 views
0

我的wxPython代码存在一些大小问题。我有一个StaticText帮助消息,可以显示或隐藏,并且消息需要根据用户模式进行更改。wxPython StaticText在文本更改时不会调整大小

默认情况下会发生的情况是,包含StaticText的BoxSizer在第一次显示StaticText时会正确地假设它的大小,但在StaticText内容更改时不会重新调整大小。

我最初的代码看起来像这样(为背景,完整的代码是在我的帖子的末尾):

 self.msg_text = wx.StaticText(self.panel, label=self.default_msg_text, 
             style=wx.TE_CENTER | wx.EXPAND, 
             name='help msg text’) 
     self.help_msg_boxsizer.Add(self.msg_text, flag=wx.EXPAND) 
     self.help_msg_boxsizer.ShowItems(False) 

然后我尝试手动设置大小:

 self.msg_text_size = (500, 100) 
     self.msg_text = wx.StaticText(self.panel, label=self.default_msg_text, 
             style=wx.TE_CENTER | wx.EXPAND, 
             name='help msg text', 
             size=self.msg_text_size) 
     self.help_msg_boxsizer.Add(self.msg_text, flag=wx.EXPAND) 
     self.help_msg_boxsizer.ShowItems(False) 

,然后使用:

self.msg_text.SetSize(new_size) 
    # or 
    self.help_msg_boxsizer.GetStaticBox.SetSize(new_size) 

但无论这些线似乎工作。相反,无论如何,(500,100)的初始尺寸似乎仍然可以使用。

我想设置大小提示可能有帮助,但它似乎没有任何效果:

self.help_msg_boxsizer.SetSizeHints() 

最后,是否存在wx.EXPAND似乎没有什么区别。

总结:我想要做的是适当地重新大小self.msg_text到所需的最小尺寸时显示。我怎样才能做到这一点?

以下是完整的代码运行我的例子:

import wx 
import sys 


class GridFrame(wx.Frame): 

    def __init__(self, frame_name="grid frame", 
       panel_name="grid panel", parent=None): 
     title = 'Edit {} data'.format(panel_name) 
     super(GridFrame, self).__init__(parent=parent, id=wx.ID_ANY, 
             name=frame_name, title=title) 
     self.remove_cols_mode = False 
     self.panel = wx.Panel(self, name=panel_name)#, size=wx.GetDisplaySize()) 
     self.grid_type = str(panel_name) 
     self.InitUI() 


    ## Initialization functions 
    def InitUI(self): 
     """ 
     initialize window 
     """ 
     self.main_sizer = wx.BoxSizer(wx.VERTICAL) 
     set1 = [] 
     ## btns set 1 
     for btn_name in ['btn1']: 
      btn = wx.Button(self.panel, label=btn_name, name=btn_name) 
      set1.append((btn)) 
     self.remove_cols_button = wx.Button(self.panel, label="Remove columns", 
              name='remove_cols_btn') 
     self.Bind(wx.EVT_BUTTON, self.on_remove_cols, self.remove_cols_button) 

     ## Help message and button 
     # button 
     self.toggle_help_btn = wx.Button(self.panel, id=-1, label="Show help", 
             name='toggle_help_btn') 
     self.Bind(wx.EVT_BUTTON, self.toggle_help, self.toggle_help_btn) 
     # message 
     self.help_msg_boxsizer = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, name='help_msg_boxsizer'), 
                wx.VERTICAL) 
     self.default_msg_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec pulvinar, massa sit amet congue facilisis, augue nisl vehicula nulla, vel posuere ligula metus eu sapien. Nam vitae mauris nec turpis congue eleifend. Ut accumsan lorem risus, vitae scelerisque mi viverra at. In sit amet purus pretium, ultricies neque eget, ultricies enim. Aenean dignissim ornare mattis. Sed vitae consequat urna, et congue neque." 
     self.msg_text_size = (500, 100) 
     self.msg_text = wx.StaticText(self.panel, label=self.default_msg_text, 
             style=wx.TE_CENTER | wx.EXPAND, 
             name='help msg text', 
             size=self.msg_text_size) 
     self.help_msg_boxsizer.Add(self.msg_text, flag=wx.EXPAND) 
     self.help_msg_boxsizer.SetSizeHints(self) 
     self.help_msg_boxsizer.ShowItems(False) 

     ## Add content to sizers 
     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     vbox1 = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, label='Vbox1'), wx.VERTICAL) 

     for btn in set1: 
      vbox1.Add(btn, flag=wx.ALL, border=5) 
     vbox1.Add(self.remove_cols_button) 
     self.hbox.Add(vbox1, flag=wx.ALL, border=5) 

     # add "grid" 
     self.grid_box = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, name='grid container'), wx.VERTICAL) 
     filler = wx.StaticBox(self.panel, wx.ID_ANY, "FillerStaticBox", size=(500, 200)) 
     self.grid_box.Add(filler, 1, flag=wx.ALL|wx.EXPAND, border=5) 
     # final layout, set size 
     self.main_sizer.Add(self.hbox, flag=wx.ALL|wx.ALIGN_CENTER|wx.SHAPED, border=20) 
     self.main_sizer.AddSpacer(20) 
     self.main_sizer.Add(self.toggle_help_btn, .5, 
          flag=wx.BOTTOM|wx.ALIGN_CENTRE|wx.SHAPED, 
          border=5) 
     self.main_sizer.Add(self.help_msg_boxsizer, .5, 
          flag=wx.BOTTOM|wx.ALIGN_CENTRE|wx.SHAPED, 
          border=10) 
     self.main_sizer.AddSpacer(10) 

     self.main_sizer.Add(self.grid_box, 2, flag=wx.ALL|wx.ALIGN_CENTER|wx.EXPAND, border=10) 
     self.panel.SetSizer(self.main_sizer) 
     self.panel_sizer = wx.BoxSizer(wx.VERTICAL) 
     self.panel_sizer.Add(self.panel, 1) 
     self.SetSizer(self.panel_sizer) 
     self.panel_sizer.Fit(self) 
     self.Centre() 
     self.Show() 


    def do_fit(self, event, min_size=None): 
     """ 
     Re-fit the window to the size of the content. 
     """ 
     if event: 
      event.Skip() 
     self.panel_sizer.Fit(self) 
     self.Centre() 
     return 

    def toggle_help(self, event, mode=None): 
     """ 
     Show/hide help message on help button click. 
     """ 
     # if mode == 'open', show no matter what. 
     # if mode == 'close', close. otherwise, change state 
     btn = self.toggle_help_btn 
     shown = self.help_msg_boxsizer.GetStaticBox().IsShown() 

     # if mode is specified, do that mode 
     if mode == 'open': 
      self.msg_text.SetSize(self.msg_text_size) 
      self.help_msg_boxsizer.GetStaticBox().SetSize(self.msg_text_size) 
      #self.help_msg_boxsizer.Fit(self.msg_text) 
      self.help_msg_boxsizer.ShowItems(True) 
      btn.SetLabel('Hide help') 
     elif mode == 'close': 
      self.help_msg_boxsizer.ShowItems(False) 
      btn.SetLabel('Show help') 
     # otherwise, simply toggle states 
     else: 
      if shown: 
       self.help_msg_boxsizer.ShowItems(False) 
       btn.SetLabel('Show help') 
      else: 
       self.msg_text.SetSize(self.msg_text_size) 
       self.help_msg_boxsizer.GetStaticBox().SetSize(self.msg_text_size) 
       #self.help_msg_boxsizer.Fit(self.msg_text) 
       self.help_msg_boxsizer.ShowItems(True) 
       btn.SetLabel('Hide help') 

     self.do_fit(None) 


    ## Events 

    def on_remove_cols(self, event): 
     """ 
     enter 'remove columns' mode 
     """ 
     self.remove_cols_mode = True 
     self.remove_cols_button.SetLabel("end delete column mode") 
     self.remove_cols_button.SetSize(self.remove_cols_button.GetBestSize()) 
     # change button to exit the delete columns mode 
     self.Unbind(wx.EVT_BUTTON, self.remove_cols_button) 
     self.Bind(wx.EVT_BUTTON, self.exit_col_remove_mode, self.remove_cols_button) 
     # then make some visual changes 
     self.msg_text_size = (50, 50) 
     self.msg_text.SetLabel("Remove grid columns: click on a column header to delete it.Required headers for {}s may not be deleted.".format(self.grid_type)) 
     self.toggle_help(event=None, mode='open') 
     self.grid_box.GetStaticBox().SetWindowStyle(wx.DOUBLE_BORDER) 

    def exit_col_remove_mode(self, event): 
     """ 
     go back from 'remove cols' mode to normal 
     """ 
     # close help messge 
     self.toggle_help(event=None, mode='close') 
     # update mode 
     self.remove_cols_mode = False 
     self.grid_box.GetStaticBox().SetWindowStyle(wx.DEFAULT) 
     self.msg_text.SetLabel(self.default_msg_text) 
     self.msg_text_size = (500, 150) 
     self.help_msg_boxsizer.Fit(self.help_msg_boxsizer.GetStaticBox()) 
     self.toggle_help(None, mode='close') 
     # re-bind self.remove_cols_button 
     self.Bind(wx.EVT_BUTTON, self.on_remove_cols, self.remove_cols_button) 
     self.remove_cols_button.SetLabel("Remove columns") 
     self.do_fit(None) 


if __name__ == "__main__": 
    app = wx.App() 
    frame = GridFrame() 
    if '-i' in sys.argv: 
     import wx.lib.inspection 
     wx.lib.inspection.InspectionTool().Show() 
    app.MainLoop() 

回答

2

你不应该需要任何的是,简单地对父母打电话布局,或者分级机向上的层次,当文本是一个改变应该足够了。

此外,我看到您将help_msg_boxsizer添加到main_sizer时,会设置wx.SHAPED标志。这会告诉父级sizer保持与物品第一次添加到sizer时相同的长宽比,这可能会使sizer和静态文本的大小大于0像素高。

最后,你在几个地方使用了0.5的比例值。该参数是一个整数,所以它只会被截断为零,并不会做你可能希望它会。比例工作的方式是,sizer使用的比例值的总和用于计算自由空间的分配方式。例如,如果一个box sizer具有比例为1,1,2的项目,则前两个分别获得可用空间的25%,第三个获得50%。

相关问题