You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:06:32