wxPython/wxGtk平台问题:模态对话框打开时无法强制刷新布局
wxDialog模态窗口布局不稳定问题
系统信息:
Linux: Lubuntu/Ubuntu Jammy 21.04.1 x86_64 wxPython: python3-wxgtk4.0 4.0.7 wxWidgets: libwxgtk3.0-gtk3-0 Gtk: libgtk-3-0 3.24.33
我遇到一个平台相关问题:创建wx.Dialog模态窗口时,无法在打开时稳定强制更新其布局。
代码示例:
class Dialog(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent, wx.ID_ANY, "A Dialog Window", parent.GetPosition(), wx.Size(640, 480), wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) tabs = wx.Notebook(self) # 创建带有居中文本的第一页 panel1 = wx.Panel(tabs, wx.ID_ANY) layout1 = wx.BoxSizer(wx.VERTICAL) layout1.AddStretchSpacer() layout1.Add(wx.StaticText(panel1, label="Centered"), 1, wx.ALIGN_CENTER) layout1.AddStretchSpacer() panel1.SetSizer(layout1) panel1.SetAutoLayout(True) panel1.Layout() # 创建带有非居中文本的第二页 panel2 = wx.Panel(tabs, wx.ID_ANY) layout2 = wx.BoxSizer(wx.VERTICAL) layout2.Add(wx.StaticText(panel2, label="Not Centered"), 1) panel2.SetSizer(layout2) panel2.SetAutoLayout(True) panel2.Layout() tabs.AddPage(panel1, "Page 1") tabs.AddPage(panel2, "Page 2") class Window(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Test", wx.Point(50, 50), wx.Size(200, 200)) btn = wx.Button(self, wx.ID_ANY, "PUSH ME") btn.Bind(wx.EVT_BUTTON, self.onButton) def onButton(self, evt): dia = Dialog(self) dia.ShowModal() #dia.Destroy()
多次打开和关闭对话框时,文本并非始终居中或完整显示。当文本正确居中显示时,系统会抛出错误信息:gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkNotebook
若不调用Destroy()方法,对话框一旦正确对齐,后续打开都会保持正确状态。
我尝试在构造函数中及实例化后调用Refresh()和Update()方法,对对话框、wx.Notebook及面板强制重绘,但均无效。唯一有效的方法是将对话框作为主窗口的类成员实例化(且不调用wx.Dialog.Destroy()):
... self.dia = Dialog(self) def onButton(self, evt): self.dia.ShowModal()
这是否是Gtk UI无法规避的限制?我查阅资料建议使用Refresh()和Update(),但对我无效,也尝试在调用ShowModal()前使用wx.GetApp().Yield()。
补充说明: 以下是对话框文本未居中且未完整显示的截图:
若移除panel1.Layout()调用,文本可完整显示但仍不居中;若用SetSizerAndFit替代SetSizer和SetAutoLayout,会为上方spacer分配空间,但文本仍不居中:
... #panel1.SetSizer(layout1) #panel1.SetAutoLayout(True) #panel1.Layout() panel1.SetSizerAndFit(layout1) ...

内容的提问来源于stack exchange,提问作者AntumDeluge
相关产品推荐
相关产品推荐

