繁体   English   中英

wxpython中的面板排列

[英]Panel arrangement in wxpython

背景技术作为python和GUI编程的新手,我想创建一个基于wxpython的GUI应用程序。 该GUI将运行一系列测试。将运行以文本文件编写的测试,并且其步骤应显示在窗口中。 要选择特定测试,请单击该特定测试的复选框(下图中的CheckListCtrl)。 测试结果将显示在MulilineTextCtrl_2Log中

窗口应如下所示:

我的ASCII艺术不是很好,但是无论如何

|-------------------------------------------------------------|  
|WINDOW TITLExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_[]X|  
|xxx[SelectAll]xxxxxx[DeselectAll]xxxxxxxxxxxxxxxxxxxxxxxxxxxx|    
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|  
|[CheckListCtrl] [MultilineTexTCtrl_1]xxxxxxxxxxxxxxxxxxxxxxxx|  
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|  
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[Refresh]xxx|  
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[Execute]xxx|  
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|   
|xxxxxxx[MulilineTextCtrl_2Log]xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|     
|_____________________________________________________________|

我在为此窗口创建boxsizer时遇到了麻烦。 我无法可视化面板的创建

  TestList = [('Test1', 'Test1Description1', 'base'), ('Test2', 'Test1Description1', 'base'),'Test3', 'Test1Description3', 'base'),] class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin): def __init__(self, parent): wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) CheckListCtrlMixin.__init__(self) ListCtrlAutoWidthMixin.__init__(self) class MainGUI(wx.frame): panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) hbox = wx.BoxSizer(wx.HORIZONTAL) #topPanel = wx.Panel(panel,-1) topPanel = wx.Panel(panel, -1,pos=(0,0)) bottomPanel = wx.Panel(panel, -1,pos=(1,0)) self.log = wx.TextCtrl(bottomPanel, -1, style=wx.TE_MULTILINE) self.list = CheckListCtrl(bottomPanel) self.list.InsertColumn(0, 'TestID', width=140) self.list.InsertColumn(1, 'TestDescription') for i in TestList: index = self.list.InsertStringItem(sys.maxint, i[0]) self.list.SetStringItem(index, 1, i[1]) self.list.SetStringItem(index, 2, i[2]) vbox2 = wx.BoxSizer(wx.VERTICAL) sel = wx.Button(topPanel, -1, 'Select All', size=(100, -1)) des = wx.Button(topPanel, -1, 'Deselect All', size=(100, -1)) refresh = wx.Button(bottomPanel, -1, 'Refresh', size=(100, -1)) apply = wx.Button(bottomPanel, -1, 'Execute', size=(100, -1)) self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=sel.GetId()) self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=des.GetId()) self.Bind(wx.EVT_BUTTON, self.OnRefresh, id=refresh.GetId()) self.Bind(wx.EVT_BUTTON, self.OnExecute, id=apply.GetId()) vbox2.Add(sel, 0, wx.TOP, 5) vbox2.Add(des) vbox2.Add(apply,wx.RIGHT) vbox2.Add(refresh) topPanel.SetSizer(vbox2) vbox.Add(self.list, 1, wx.EXPAND, 3) vbox.Add((-1, 10)) vbox.Add(self.log, 0.5, wx.EXPAND) vbox.Add((-1, 10)) bottomPanel.SetSizer(vbox) hbox.Add(bottomPanel, 0, wx.EXPAND | wx.RIGHT, 5) panel.SetSizer(hbox) self.Centre() self.Show(True) def OnSelectAll(self, event): num = self.list.GetItemCount() for i in range(num): self.list.CheckItem(i) def OnDeselectAll(self, event): num = self.list.GetItemCount() for i in range(num): self.list.CheckItem(i, False) def OnRefresh(self, event): num = self.list.GetItemCount() for i in range(num): if i == 0: self.log.Clear() if self.list.IsChecked(i): self.log.AppendText(self.list.GetItemText(i) + '\\n') def OnExecute(self, event): num = self.list.GetItemCount() for i in range(num): if i == 0: self.log.Clear() if self.list.IsChecked(i): self.log.AppendText(self.list.GetItemText(i) + '\\n') app = wx.App() MainGUI(None, -1, 'Tester') app.MainLoop() 

我建议您使用wxglade设计GUI。 它是快速而有效的,并且您有一定的经验之后,就可以完成大多数可以手动完成的事情。

wxglade没有wx.lib部件suchs作为CheckListCtrlMixinListCtrlAutoWidthMixin您正在使用或组合,如类CheckListCtrl

为了能够使用它们,请在GUI中使用可用的小部件(例如wx.panel)临时填充一个槽,然后在生成代码后,用特殊或自定义的wx.Panel实例化实例手动替换。类。

最后,您的代码存在一些会产生异常的主要问题,例如wx.frame(对于wx.Frame),缩进错误或未定义的TestList。 您的MainGUI类没有__init__方法,也没有初始化父wx.Frame 同样,将bottomPanel添加到hbox sizer中,但不添加到topPanel

您编写的组织不会产生您所描述的GUI结构,而是由两个面板和几个小部件组成:

在此处输入图片说明

为了更接近您的描述,您至少需要添加几个其他的尺寸调整器。 使用wxglade,它将为您完成一切。

在这里,你已经在wxglade生成的代码为像您这样的设计(替代wx.ListCtrlCheckListCtrl

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade HG on Tue Oct 04 12:45:03 2011

import wx

# begin wxGlade: extracode
# end wxGlade

class MainGUI(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainGUI.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.button_3 = wx.Button(self, -1, "Select All")
        self.button_4 = wx.Button(self, -1, "DeselectAll")
        self.list_ctrl_1 = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
        self.button_1 = wx.Button(self, -1, "Refresh")
        self.button_2 = wx.Button(self, -1, "Execute")
        self.text_ctrl_2 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MainGUI.__set_properties
        self.SetTitle("frame_1")
        self.SetBackgroundColour(wx.Colour(255, 170, 5))
        self.list_ctrl_1.SetMinSize((200, 264))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MainGUI.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_4.Add(self.button_3, 0, wx.ALL, 5)
        sizer_4.Add(self.button_4, 0, wx.ALL, 5)
        sizer_4.Add((20, 20), 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_4, 0, wx.EXPAND, 0)
        sizer_2.Add(self.list_ctrl_1, 0, wx.ALL|wx.EXPAND, 5)
        sizer_2.Add(self.text_ctrl_1, 0, wx.ALL|wx.EXPAND, 5)
        sizer_3.Add(self.button_1, 0, wx.ALL, 5)
        sizer_3.Add(self.button_2, 0, wx.ALL, 5)
        sizer_2.Add(sizer_3, 0, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        sizer_1.Add(self.text_ctrl_2, 0, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

# end of class MainGUI

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MainGUI(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()

外观:

在此处输入图片说明

请注意,正如在其他答案中所说的那样,不需要将窗口小部件放置在面板( widget(panel,..) )中,而将面板放置在大小调整器中。 它可以工作,但最好将窗口小部件(作为框架的子项-> widget(self,..) )放入大小调整器( sizerx.Add(widget,..) )中,将大小调整器放入大小调整器( sizery.Add(sizerx) )来构建结构。
通常,您不修改此代码。 您可以将其子类化,以添加您的功能或所需的任何其他高级功能。 这样,您始终可以再次使用wxglade更改小部件的位置,以添加其他小部件或调整器并重新生成完整文件。

您实际上并不需要所有这些额外的面板。 实际上,除了wx.Notebooks之类的东西之外,您几乎不需要多个。 相反,我发现可视化这种事情的最简单方法是在一张纸上画出草图,然后在这些东西周围绘制矩形。 为此,我将垂直放置一个主BoxSizer。 然后,我将对按钮使用两个水平的BoxSizers,对控件使用另一个。 如果必须以其他方式放置其他三个小部件,则可能需要其他一些带有间隔的BoxSizer。 无论如何,一旦在各种BoxSizers中具有小部件,就将它们添加到MainSizer中就可以了。

或者,您可以将GridSizer与最后三个分隔符一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM