wxpython的面板布置

2024-10-02 16:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

背景 作为python和GUI编程的新手,我想创建一个基于wxpython的GUI应用程序。这个图形用户界面将运行一系列的测试,用文本文件编写的测试将要运行,它的步骤应该显示在窗口中。要选择特定的测试,请单击该特定测试的复选框(下图中的CheckListCtrl)。测试结果将显示在MulilineTextCtrl\u 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时遇到了问题。我很难想象面板的创建

^{pr2}$


Tags: 应用程序编程wxpython步骤gui图形用户界面复选框xxx
2条回答

你不需要那些额外的面板。事实上,除了wx.笔记本诸如此类。取而代之的是,我发现最简单的方法就是在一张纸上画出草图,然后在周围画出矩形。为此,我需要一个垂直方向的主BoxSizer。然后我将使用两个水平的boxsizer作为按钮和next to控件。如果您必须这样定位其他三个单独的小部件,那么您可能需要其他一些带有空格的boxsizer。不管怎样,一旦你在各种boxsizer中有了小部件,你就把它们添加到MainSizer中,就完成了。在

或者你可以使用一个网格大小调整器,在最后三个空格中加上几个空格。在

我建议您使用wxglade来设计gui。它是快速和有效的,在你有一些经验后,你可以做你可以手动做的大部分事情。在

wxglade没有wx.lib文件小部件,如您正在使用的CheckListCtrlMixinListCtrlAutoWidthMixin,或组合,如您的类CheckListCtrl。在

为了能够使用这些工具,可以用一个可用的小部件(p.e.awx.面板)然后,在生成代码之后,手动替换wx.面板使用特殊类或自定义类的实例化。在

最后,您的代码有一些产生异常的主要问题,例如wx.框架(用于wx.框架),错误的缩进或未定义的测试列表。MainGUI类没有__init__方法,也没有初始化父类wx.Frame。另外,bottomPanel被添加到hbox大小器中,而不是{}。在

您编写的组织不会生成您所描述的GUI结构,而是生成两个面板(包含多个小部件)的GUI结构:

enter image description here

为了更接近您的描述,您至少需要添加两个额外的sizer。 使用wxglade,它会为你做一切。在

这里有wxglade为类似于您的设计生成的代码(用您的CheckListCtrl替换wx.ListCtrl

#!/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()

以及外观:

enter image description here

请注意,正如在另一个答案中所说的,没有必要将小部件放入面板(widget(panel,..))中,面板也不需要放在尺寸器中。它可以工作,但最好是将小部件(作为frame->;widget(self,..))放入sizer(sizerx.Add(widget,..))中,将sizer放入sizers(sizery.Add(sizerx))中来构建结构。
通常不修改此代码。相反,您可以将其子类化以添加您的功能或任何您需要的花哨的添加。通过这种方式,您可以始终再次使用wxglade来更改小部件的位置,或者添加其他小部件或大小调整器并重新生成整个文件。在

相关问题 更多 >