WxPython 使用列表框和其他带有按钮的 UserInput

WxPython using Listbox and other UserInput with a Button

我正在尝试创建一个基于特定用户输入的网络爬虫。例如,我尝试接收的用户输入来自列表框和文本字段。获得该信息后,我希望用户单击一个按钮开始使用收集到的信息进行搜索。

这是我遇到问题的地方。 EVT 函数无法识别列表框,因为它已链接到 Button evt。有没有办法解决这个问题? EVT 信息可以与其他 EVT 共享吗?

这是我目前的情况:

import wx  # for gui


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Title', size=(300,200))
        tournLevel = [',000', ',000', ',000', ',000',',000','0,000']
        levelBox = wx.ListBox(panel, -1, (40, 50), (90, 90), tournLevel)
        levelBox.SetSelection(1)  # default selection
        checkButton = wx.Button(panel, label= "Check Now", pos = (150, 50), size = (90, 40))
        self.Bind(wx.EVT_BUTTON, self.OnClick, checkButton)

    def OnClick(self, event):
        currLevel = event.GetSelection()
        print(currLevel) # to test if GetSelection is working


if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

如果我能得到识别 ListBox 结果的按钮,我会很高兴。 感谢您的宝贵时间!

您可以直接从列表框中获取它,您不需要从事件中获取它。见下文:

import wx  # for gui


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Title', size=(300,200))
        tournLevel = [',000', ',000', ',000', ',000',',000','0,000']
        self.levelBox = wx.ListBox(panel, -1, (40, 50), (90, 90), tournLevel)
        self.levelBox.SetSelection(1)  # default selection
        self.checkButton = wx.Button(panel, label= "Check Now", pos = (150, 50), size = (90, 40))
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.checkButton)

    def OnClick(self, event):
        currLevel = self.levelBox.GetSelection()
        print(currLevel) # to test if GetSelection is working


if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

更具体地说,如果您将 levelBox 存储为 self.levelBox,它将在 OnClick 方法中作为 MyFrame 属性访问。然后,您可以对该对象使用 GetSelection 方法( 而不是 事件),这将获取当前选择。

您可以将 levelBox 变成 class 的 属性,方法是将它变成 self.levelBox 并像@brettb 提到的那样访问它。但是,您可以偷偷摸摸地使用 lambda 进行回调,以将列表框小部件传递给事件处理程序:

import wx  # for gui


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Title', size=(300,200))
        panel = wx.Panel(self)
        tournLevel = [',000', ',000', ',000', ',000',',000','0,000']
        levelBox = wx.ListBox(panel, -1, (40, 50), (90, 90), tournLevel)
        levelBox.SetSelection(1)  # default selection
        checkButton = wx.Button(panel, label= "Check Now", pos = (150, 50), size = (90, 40))
        evt = lambda caller, widget=levelBox: self.OnClick(caller, widget)
        checkButton.Bind(wx.EVT_BUTTON, evt)

    def OnClick(self, event, widget):
        currLevel = widget.GetSelection()
        print(currLevel) # to test if GetSelection is working
        print widget.GetString(currLevel)


if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

另请注意,您没有定义 panel,因此您的原始代码不起作用。有关详细信息,请参阅以下内容: