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()