如何制作多行wx.ListBox

0 投票
2 回答
1456 浏览
提问于 2025-04-16 20:39

我需要一个列表框来显示电话簿。然后我想在每个列表项的顶部显示名字,底部显示号码,就像电话本一样。怎么把这些数据绑定到列表框里呢?

现在我已经做了一个单行的列表框,如下所示:

    cur.execute("select fname from tblsample1 order by fname")
    names = [str(item[0]) for item in cur.fetchall()]
    lvnames=wx.ListBox(panel,-1,(10,40),(210,180),names, wx.LB_SINGLE)

怎么把sqlite3的游标(包含两列数据)绑定到列表视图里呢?

我需要一个wx.ListBox的鼠标点击事件(不是EVT_LISTBOX,因为我只需要鼠标点击事件)。

2 个回答

1

你应该重新表述一下你的问题,我不太确定我理解得对不对。

如果你只需要在你的 ListBox 中显示两行内容,你可以简单地使用 \n 来换行:

cur.execute("select fname,number from tblsample1 order by fname")
entries = [str(item[0])+'\n'+str(item[1]) for item in cur.fetchall()]

要获取一个“点击”事件,你可以把你的 wx.ListBox 的样式设置为 wx.LC_SINGLE_SEL,然后捕捉选择事件 wx.EVT_LIST_ITEM_SELECTED

3

使用 HtmlListBox,下面有一个简单的例子可以帮助你入门。

import wx


class PhoneNumbers(wx.HtmlListBox):
    def __init__(self, parent):
        wx.HtmlListBox.__init__(self, parent)
        self.data = [
            ("Foo", "3452-453"),
            ("Bar", "5672-346"),
        ]
        self.SetItemCount(len(self.data))

    def OnGetItem(self, n):
        return "<b>%s</b><br>%s" % self.data[n]

    def add_number(self, name, number):
        self.data.append((name, number))
        self.SetItemCount(len(self.data))
        self.Refresh()


class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(200, 400))

        self.numbers = PhoneNumbers(self)
        self.contact_name = wx.TextCtrl(self)
        self.contact_number = wx.TextCtrl(self)
        self.add_btn = wx.Button(self, label="Add contact")

        self.Sizer = wx.BoxSizer(wx.VERTICAL)
        self.Sizer.Add(self.numbers, 1, wx.EXPAND)
        self.Sizer.Add(wx.SearchCtrl(self), 0, wx.EXPAND)
        self.Sizer.Add(wx.StaticText(self, label="Name"), 0, wx.TOP, 10)
        self.Sizer.Add(self.contact_name)
        self.Sizer.Add(wx.StaticText(self, label="Number"), 0, wx.TOP, 5)
        self.Sizer.Add(self.contact_number)
        self.Sizer.Add(self.add_btn, 0, wx.ALL, 10)

        self.numbers.Bind(wx.EVT_LISTBOX, self.OnSelectNumber)
        self.add_btn.Bind(wx.EVT_BUTTON, self.OnAddNumber)

    def OnSelectNumber(self, event):
        name, number = self.numbers.data[event.Selection]
        self.contact_name.Value = name
        self.contact_number.Value = number

    def OnAddNumber(self, event):
        self.numbers.add_number(
            self.contact_name.Value,
            self.contact_number.Value
        )


app = wx.PySimpleApp()
app.TopWindow = f = Frame()
f.Show()
app.MainLoop()

撰写回答