【问题标题】:wxpython panel size and titleswxpython 面板大小和标题
【发布时间】:2013-10-18 07:21:33
【问题描述】:

当我应用以下代码时,第二个面板显示在第一个面板之上。我想知道如何在不重叠的情况下获得两个面板,并且窗口(框架)的大小合适。我还想知道是否有任何合适的方法可以在面板中绘制某种标题(在本例中为“输入:”和“输出:”)。谢谢!

import wx

class Input_Panel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        # Input variables
        self.tittle1 = wx.StaticText(self, label="Inputs:")    
        self.lblname1 = wx.StaticText(self, label="Input 1:")
        self.format1 = ['Option 1','Option 2']
        self.combo1 = wx.ComboBox(self, size=(200, -1),value='', choices=self.format1, style=wx.CB_DROPDOWN)
        self.lblname2 = wx.StaticText(self, label="Input 2")
        self.format2 = ['Option 1','Option 2', 'Option 3']
        self.combo2 = wx.ComboBox(self, size=(200, -1),value='', choices=self.format2, style=wx.CB_DROPDOWN)

        # Set sizer for the panel content
        self.sizer = wx.GridBagSizer(2, 2)
        self.sizer.Add(self.tittle1, (1, 2))
        self.sizer.Add(self.lblname1, (2, 1))
        self.sizer.Add(self.combo1, (2, 2))
        self.sizer.Add(self.lblname2, (3, 1))
        self.sizer.Add(self.combo2, (3, 2))
        self.SetSizer(self.sizer)

class Output_Panel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        # Output variables
        self.tittle2 = wx.StaticText(self, label="Outputs:")    
        self.lblname3 = wx.StaticText(self, label="Output1")
        self.result3 = wx.StaticText(self, label="", size=(100, -1))

        # Set sizer for the panel content
        self.sizer = wx.GridBagSizer(2, 2)
        self.sizer.Add(self.tittle2, (1, 2))
        self.sizer.Add(self.lblname3, (2, 1))
        self.sizer.Add(self.result3, (2, 2))
        self.SetSizer(self.sizer)

class Main_Window(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title = title)

        # Set variable panels
        self.splitter = wx.SplitterWindow(self)
        self.panel1 = Input_Panel(self.splitter)
        self.panel2 = Output_Panel(self.splitter)
        self.splitter.SplitVertically(self.panel1, self.panel2)

        self.windowSizer = wx.BoxSizer(wx.VERTICAL)
        self.windowSizer.Add(self.splitter, 1, wx.ALL | wx.EXPAND)   
        self.SetSizerAndFit(self.windowSizer)

def main():
    app = wx.App(False)
    frame = Main_Window(None, "App GUI")
    frame.Show()
    app.MainLoop()

if __name__ == "__main__" :
    main()

【问题讨论】:

    标签: python wxpython size panel


    【解决方案1】:

    您可以使用小部件检查工具来帮助您弄清楚发生了什么。我使用它的高亮功能来确定每个面板的位置和大小。你可以在这里阅读更多信息:http://wiki.wxpython.org/Widget%20Inspection%20Tool

    SplitterWindow 不会平均拆分项目。您将需要调用拆分器的 SetMinimumPaneSize 以使它们都可见。我修改了您的代码以向您展示我在说什么,并演示如何添加检查工具:

    import wx
    
    class Input_Panel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
            # Input variables
            self.tittle1 = wx.StaticText(self, label="Inputs:")    
            self.lblname1 = wx.StaticText(self, label="Input 1:")
            self.format1 = ['Option 1','Option 2']
            self.combo1 = wx.ComboBox(self, size=(200, -1),value='', choices=self.format1, style=wx.CB_DROPDOWN)
            self.lblname2 = wx.StaticText(self, label="Input 2")
            self.format2 = ['Option 1','Option 2', 'Option 3']
            self.combo2 = wx.ComboBox(self, size=(200, -1),value='', choices=self.format2, style=wx.CB_DROPDOWN)
    
            # Set sizer for the panel content
            self.sizer = wx.GridBagSizer(2, 2)
            self.sizer.Add(self.tittle1, (1, 2))
            self.sizer.Add(self.lblname1, (2, 1))
            self.sizer.Add(self.combo1, (2, 2))
            self.sizer.Add(self.lblname2, (3, 1))
            self.sizer.Add(self.combo2, (3, 2))
            self.SetSizer(self.sizer)
    
    class Output_Panel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
            # Output variables
            self.tittle2 = wx.StaticText(self, label="Outputs:")    
            self.lblname3 = wx.StaticText(self, label="Output1")
            self.result3 = wx.StaticText(self, label="", size=(100, -1))
    
            # Set sizer for the panel content
            self.sizer = wx.GridBagSizer(2, 2)
            self.sizer.Add(self.tittle2, (1, 2))
            self.sizer.Add(self.lblname3, (2, 1))
            self.sizer.Add(self.result3, (2, 2))
            self.SetSizer(self.sizer)
    
    class Main_Window(wx.Frame):
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title = title, size=(800,600))
    
            # Set variable panels
            self.splitter = wx.SplitterWindow(self, style = wx.SP_LIVE_UPDATE)
            self.panel1 = Input_Panel(self.splitter)
            self.panel2 = Output_Panel(self.splitter)
            self.splitter.SplitVertically(self.panel1, self.panel2)
            w, h = self.GetSize()
            self.splitter.SetMinimumPaneSize(w/2)
    
            self.windowSizer = wx.BoxSizer(wx.VERTICAL)
            self.windowSizer.Add(self.splitter, 1, wx.ALL | wx.EXPAND)   
    
            #self.SetSizerAndFit(self.windowSizer)
    
    def main():
        import wx.lib.inspection
        app = wx.App(False)
        frame = Main_Window(None, "App GUI")
        frame.Show()
        wx.lib.inspection.InspectionTool().Show()
        app.MainLoop()
    
    if __name__ == "__main__" :
        main()
    

    【讨论】:

    • 非常感谢,这很有效,但我想知道是否可以为每个面板设置不同的尺寸。在扩展代码中,右侧面板比左侧面板小很多,使用“self.splitter.SetMinimumPaneSize(120)”时看起来不太好。是否可以按照我之前的要求添加标题?
    • 我实际上会使用框架的大小,然后将窗格大小设置为一半以使它们相等。至于标题,您必须使用 StaticText 小部件或类似部件
    • 我知道我想要的太多了,但是我可以问你一个例子吗?
    • 你已经确定了标题,所以我刚刚更新了代码以使用框架的大小来调整面板的大小
    • 对不起,我想我表达的不对。我不希望窗格显示相同的大小。我想要左边的比右边的大,但仍然需要完全看到。似乎 SetMinimumPaneSize 对两个窗格的影响相同。
    【解决方案2】:

    修改

    self.SetSizer(self.sizer)
    

    通过

    self.SetSizerAndFit(self.sizer)
    

    Input_Panel 和 output_Panel 类也可以正确调整面板的大小。

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多