You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

使用SetSizerAndFit后的未居中文本

内容的提问来源于stack exchange,提问作者AntumDeluge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:36:32