如何在wxPython中通过按钮获取滑块信息?解决AttributeError报错
解决wxPython中按钮点击获取滑块值时的AttributeError错误
你遇到的AttributeError: 'Button' object has no attribute 'GetValue'是因为点击按钮触发事件时,event.GetEventObject()返回的是触发事件的按钮对象,而wx.Button确实没有GetValue()方法——你真正需要获取的是滑块(Slider)的值,而非按钮的。
代码问题分析
你在绑定按钮事件时写了self.Bind(wx.EVT_BUTTON, self.val, button,slider),这里第四个参数是userData,但你没有在回调方法里正确使用这个参数,反而去获取事件源(按钮)的GetValue(),这才导致报错。
以下是两种可行的修复方案:
方案1:将滑块设为类实例属性
把slider定义为类的实例属性,这样在按钮点击的回调方法里可以直接访问滑块对象并获取值:
import wx import os style = wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER class main(wx.Frame) : def __init__(self,parent,id) : wx.Frame.__init__(self,parent,id,"Slider", size=(500,300),style=style) panel=wx.Panel(self) button=wx.Button(panel,label="Work!", pos=(90,90), size=(100,100)) # 将slider设为类实例属性 self.slider= wx.Slider(panel, value=1, minValue=1, maxValue=255, style= wx.SL_HORIZONTAL | wx.SL_LABELS, pos=(200,90), size=(250,60)) self.Bind(wx.EVT_BUTTON, self.val, button) self.Bind(wx.EVT_CLOSE, self.closewindow) self.Center() def val(self,event): # 直接访问类属性slider获取值 val = self.slider.GetValue() print(val) def closewindow(self,windows): self.Destroy() if __name__=='__main__': app=wx.PySimpleApp() frame=main(parent=None,id=1) frame.Show() app.MainLoop()
方案2:通过事件的userData传递滑块对象
绑定事件时把slider作为userData传入,在回调方法里通过event.GetUserData()获取滑块:
import wx import os style = wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER class main(wx.Frame) : def __init__(self,parent,id) : wx.Frame.__init__(self,parent,id,"Slider", size=(500,300),style=style) panel=wx.Panel(self) button=wx.Button(panel,label="Work!", pos=(90,90), size=(100,100)) slider= wx.Slider(panel, value=1, minValue=1, maxValue=255, style= wx.SL_HORIZONTAL | wx.SL_LABELS, pos=(200,90), size=(250,60)) # 将slider作为userData传入Bind方法 self.Bind(wx.EVT_BUTTON, self.val, button, slider) self.Bind(wx.EVT_CLOSE, self.closewindow) self.Center() def val(self,event): # 获取传入的滑块对象 slider = event.GetUserData() val = slider.GetValue() print(val) def closewindow(self,windows): self.Destroy() if __name__=='__main__': app=wx.PySimpleApp() frame=main(parent=None,id=1) frame.Show() app.MainLoop()
方案说明
- 方案1更直观,适合简单界面,直接通过类属性访问控件;
- 方案2适合需要给多个按钮绑定同一个回调、每个按钮对应不同滑块的场景,通过userData区分不同的滑块。
内容的提问来源于stack exchange,提问作者user19886790
相关产品推荐
相关产品推荐

