wx.StaticText标签调用SetSizerAndFit()后无法正常收缩的问题
解决wxPython中文件名过长无法自动收缩显示的问题
你的推测没错,SetSizerAndFit()确实是问题根源:它会让对话框固定在初始控件布局的最佳尺寸,后续更新长文件名时,StaticText没有被限制宽度,无法触发wx.ST_ELLIPSIZE_END的省略逻辑。同时初始时input_filename为空,sizer计算的宽度为0,更新标签后也不会自动重新约束宽度。
关键修改点
- 给
input_filename设置比例权重(比如1)和wx.EXPAND属性,让它在水平sizer中占据剩余可用空间,从而被限制宽度 - 替换
SetSizerAndFit()为普通的SetSizer(),并设置对话框最小宽度,避免初始尺寸过小 - 更新文件名后触发布局刷新,确保sizer重新计算控件尺寸
修改后的完整代码
import wx class Dlg(wx.Dialog): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.input_pnl = wx.Panel(self) self.choose_input = wx.Button(self.input_pnl, label='Select') # 保留省略号样式 self.input_filename = wx.StaticText(self.input_pnl, style=wx.ST_ELLIPSIZE_END) self.input_szr = wx.BoxSizer(wx.HORIZONTAL) self.input_szr.AddMany([ (wx.StaticText(self.input_pnl, label='File to analyze'), 0, wx.ALIGN_CENTER | wx.RIGHT, 7), (self.choose_input, 0, wx.RIGHT, 7), # 关键修改:设置比例1和EXPAND,让文本框占据剩余空间 (self.input_filename, 1, wx.ALIGN_CENTER | wx.EXPAND) ]) self.input_pnl.SetSizer(self.input_szr) borderSizer = wx.BoxSizer(wx.VERTICAL) borderSizer.AddMany([ (self.input_pnl, 0, wx.EXPAND | wx.ALL, 10), (wx.StaticText(self, label='Some example text to shift the border to the right'), 0, wx.ALL, 10) ]) # 替换SetSizerAndFit,改为普通SetSizer并设置最小宽度 self.SetSizer(borderSizer) self.SetSizeHints(minW=400, minH=-1) self.choose_input.Bind(wx.EVT_BUTTON, self.on_choose_input) def on_choose_input(self, event): with wx.FileDialog(self, "Open", wildcard="Plain text (*.txt)|*.txt", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog: if fileDialog.ShowModal() == wx.ID_CANCEL: return self.input_pathname = fileDialog.GetPath() self.input_filename.SetLabel(fileDialog.GetFilename()) # 更新后触发布局刷新 self.input_pnl.Layout() self.Layout() if __name__ == "__main__": app = wx.App() dlg = Dlg(None) dlg.ShowModal() dlg.Destroy() app.MainLoop()
效果说明
现在选择长文件名时,input_filename会自动占据水平方向剩余空间,当文件名长度超过控件宽度时,末尾会显示省略号(...),完美实现你想要的收缩显示效果。
内容的提问来源于stack exchange,提问作者Deeproad
相关产品推荐
相关产品推荐

