【问题标题】:Why does this StaticLine appear behind the sizer?为什么这个 StaticLine 会出现在 sizer 后面?
【发布时间】:2020-06-12 01:46:31
【问题描述】:

我试图在“Label”+TextCtrl 和单选按钮之间画一条静态线。 它仅在拖动窗口时才出现,然后它出现在所有内容的后面,我不知道为什么。

目标是在上部和下部之间水平绘制静态线。

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((237, 237))

    self.__initUI()
    self.__do_layout()

def __initUI(self):

    panel = wx.Panel(self)
    self.SetSize((350, 150))
    self.qtyField = wx.TextCtrl(panel, wx.ID_ANY, "", style=wx.TE_CENTER)
    self.qtyField.SetFocus()
    self.longRb = wx.RadioButton(panel, wx.ID_ANY, "This", style=wx.RB_GROUP)
    self.shortRb = wx.RadioButton(panel, wx.ID_ANY, "That")

def __do_layout(self):
    # begin wxGlade: MyFrame.__do_layout
    vertSizer = wx.BoxSizer(wx.VERTICAL)
    horSizer1 = wx.GridSizer(1, 2, 0, 0)
    rbSizer = wx.GridSizer(1, 2, 0, 36)

    qtyLabel = wx.StaticText(self, wx.ID_ANY, "Label")
    horSizer1.Add(qtyLabel, 0, wx.ALIGN_CENTER, 0)
    horSizer1.Add(self.qtyField, 0, wx.ALIGN_CENTER_VERTICAL, 0)
    vertSizer.Add(horSizer1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM | wx.TOP, 6)

    static_line_1 = wx.StaticLine(self, wx.ID_ANY)
    vertSizer.Add(static_line_1, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 6)

    rbSizer.Add(self.longRb, 0, wx.ALIGN_CENTER, 0)
    rbSizer.Add(self.shortRb, 0, wx.ALIGN_CENTER, 0)
    vertSizer.Add(rbSizer, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM | wx.TOP, 6)

    self.SetSizer(vertSizer)


class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

【问题讨论】:

    标签: python wxpython python-3.8 wxglade


    【解决方案1】:

    您正在将一些小部件分配给框架(自身),将其他小部件分配给面板,因此它们会在指示的位置显示自己。

    这就是你所追求的:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kwds):
            # begin wxGlade: MyFrame.__init__
            wx.Frame.__init__(self, *args, **kwds)
            self.SetSize((237, 237))
    
            self.__initUI()
            self.__do_layout()
    
        def __initUI(self):
    
            self.panel = wx.Panel(self)
            self.panel.SetBackgroundColour("green")
            self.SetSize((350, 150))
            self.qtyField = wx.TextCtrl(self.panel, wx.ID_ANY, "", style=wx.TE_CENTER)
            self.qtyField.SetFocus()
            self.longRb = wx.RadioButton(self.panel, wx.ID_ANY, "This", style=wx.RB_GROUP)
            self.shortRb = wx.RadioButton(self.panel, wx.ID_ANY, "That")
    
        def __do_layout(self):
            # begin wxGlade: MyFrame.__do_layout
            vertSizer = wx.BoxSizer(wx.VERTICAL)
            horSizer1 = wx.GridSizer(1, 2, 0, 0)
            rbSizer = wx.GridSizer(1, 2, 0, 36)
    
            qtyLabel = wx.StaticText(self.panel, wx.ID_ANY, "Label")
            horSizer1.Add(qtyLabel, 0, wx.ALIGN_CENTER, 0)
            horSizer1.Add(self.qtyField, 0, wx.ALIGN_CENTER_VERTICAL, 0)
            vertSizer.Add(horSizer1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM | wx.TOP, 6)
    
            static_line_1 = wx.StaticLine(self.panel, wx.ID_ANY)
            vertSizer.Add(static_line_1, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 6)
    
            rbSizer.Add(self.longRb, 0, wx.ALIGN_CENTER, 0)
            rbSizer.Add(self.shortRb, 0, wx.ALIGN_CENTER, 0)
            vertSizer.Add(rbSizer, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM | wx.TOP, 6)
    
            self.SetSizer(vertSizer)
    
    
    class MyApp(wx.App):
        def OnInit(self):
            self.frame = MyFrame(None, wx.ID_ANY, "")
            self.SetTopWindow(self.frame)
            self.frame.Show()
            return True
    
    # end of class MyApp
    
    if __name__ == "__main__":
        app = MyApp(0)
        app.MainLoop()
    

    【讨论】:

    • 我不知道如何与您联系,但如果您想要免费(私人使用)该软件的副本,请告诉我您的电子邮件地址。
    • @KrisM 感谢您的提议,我倾向于根据需要自己编写。两个无关的想法。最好在一个地方定义小部件并将它们布置在另一个地方,而不是像你一样混合。这样更容易发现问题。最后的想法是,赞成票/反对票微调器旁边是一个灰色的勾号。如果一个答案,让您满意地回答您的问题,我不做任何假设,点击接受答案。这确实有助于其他人过滤类似问题的可能答案。
    • 感谢您的意见。我尝试这样做,因为它们在两个独立的功能中。我想sizer也可以在 __initUI 函数中。酷 - 我们开始了!
    • @KrisM 我指的是 qtyLabelstatic_line_1 在布局中,而不是在 initUI 和其余小部件中。 do_layout 确实适用于大小调整器。这不是一个规则,它只是让您在以后检查错误或编辑时更轻松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2012-01-31
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多