0

帮助!

我是一名非 GUI 程序员,正在尝试使用 wxPython 编写一个简单的(!)程序。

我已经在网上阅读了所有可以阅读的内容,但是我总体上缺乏 GUI 经验大概是导致我看不到问题所在。

简而言之,我想要一个带有多个标签的 wxNotebook 窗口。当然,每个选项卡都有自己的子小部件。我设想有一个 wxListCtrl(如我的代码中所示)或可能有一个 wxGrid 控件,以及几个按钮。

这是我的“EmployeesPanel”类。当我运行它时,我看到一个必须代表 listctrl 的小方块,但对于我来说,我无法弄清楚如何让它看起来正确。当然,我也有可能在其他一些领域离基地很远。

任何关于我做错了什么的帮助将不胜感激。

这是代码:

import wx
import sys

employees = [('Earl Boffo', 'Software'), ('Mildred Plotka', 'Software'), ('Sugar Kane', 'QA')]

classes = [('Python'), ('Java'), ('C#')]

class EmployeesPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        # create some sizers 
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        grid = wx.GridBagSizer(hgap=5, vgap=5)

        #hSizer = wx.BoxSizer(wx.HORIZONTAL|wx.EXPAND)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)

        panel = wx.Panel(self, -1)

        self.list = wx.ListCtrl(panel, size=(100,100), style=wx.LC_REPORT)

        self.list.InsertColumn(0, 'Name')
        self.list.InsertColumn(1, 'Group')

        for i in employees:
            index = self.list.InsertStringItem(sys.maxint, i[0])
            self.list.SetStringItem(index, 1, i[1])

        # A button
        self.button = wx.Button(self, label="Exit")
        self.Bind(wx.EVT_BUTTON, self.OnClick,self.button)
        self.list.Show(True)

        # add the listctrl widget to the grid
        grid.Add(self.list, pos=(0,0), flag=wx.EXPAND|wx.ALL)

        # add the button to the grid
        grid.Add(self.button, pos=(1,0))

        # add a spacer to the sizer
        grid.Add((10, 40), pos=(1,1))

        # add grid to hSizer
        hSizer.Add(grid, 0, wx.ALL, 5)

        # add hSizer to main (v) sizer
        mainSizer.Add(hSizer, 0, wx.ALL, 5)
        self.SetSizerAndFit(mainSizer)
        self.Show()

    def EvtComboBox(self, event):
        self.logger.AppendText('EvtComboBox: %s\n' % event.GetString())
    def OnClick(self,event):
        sys.exit(3)

app = wx.App(False)
frame = wx.Frame(None, title="Training Tracker", size=(700,500))
nb = wx.Notebook(frame)

nb.AddPage(EmployeesPanel(nb), "Employees")
frame.Show()
app.MainLoop()
4

1 回答 1

2

欢迎来到 wxPython!一旦你掌握了它,它实际上会很有趣。我几乎从不使用网格尺寸器,因为它们对于像这样的简单布局来说只是一种痛苦。如果您有一个类似网格的界面,并且没有跨单元格的控件,那就太好了。否则,我几乎总是使用相互嵌套的 BoxSizer。我大大简化了您的代码以显示这两个小部件。目前列表控件仅水平拉伸。如果您也需要它垂直移动,则在 sizer.Add 部分中将比例从 0 更改为 1。

import wx
import sys

employees = [('Earl Boffo', 'Software'), ('Mildred Plotka', 'Software'), ('Sugar Kane', 'QA')]

classes = [('Python'), ('Java'), ('C#')]

class EmployeesPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        # create some sizers 
        mainSizer = wx.BoxSizer(wx.VERTICAL)

        self.list = wx.ListCtrl(self, size=(100,100), style=wx.LC_REPORT)

        self.list.InsertColumn(0, 'Name')
        self.list.InsertColumn(1, 'Group')

        for i in employees:
            index = self.list.InsertStringItem(sys.maxint, i[0])
            self.list.SetStringItem(index, 1, i[1])

        # A button
        self.button = wx.Button(self, label="Exit")
        self.Bind(wx.EVT_BUTTON, self.OnClick,self.button)

        mainSizer.Add(self.list, 0, wx.EXPAND|wx.ALL, 5)
        mainSizer.Add(self.button, 0, wx.ALL, 5)

        self.SetSizer(mainSizer)
        self.Show()

    def EvtComboBox(self, event):
        self.logger.AppendText('EvtComboBox: %s\n' % event.GetString())
    def OnClick(self,event):
        sys.exit(3)

app = wx.App(False)
frame = wx.Frame(None, title="Training Tracker", size=(700,500))
nb = wx.Notebook(frame)

nb.AddPage(EmployeesPanel(nb), "Employees")
frame.Show()
app.MainLoop()

我也认为这些文章可能会对您有所帮助:

于 2012-06-21T13:36:10.410 回答