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
,因此您的原始代码不起作用。有关详细信息,请参阅以下内容:
我正在尝试创建一个基于特定用户输入的网络爬虫。例如,我尝试接收的用户输入来自列表框和文本字段。获得该信息后,我希望用户单击一个按钮开始使用收集到的信息进行搜索。
这是我遇到问题的地方。 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
,因此您的原始代码不起作用。有关详细信息,请参阅以下内容: