如何获取Python property属性的setter函数绑定GUI onchange回调
问题
我正在使用带onchange参数的GUI模块开发,目前定义了带property属性的Settings类,需要把类属性绑定到GUI界面。
但GUI接口只接收setter函数作为回调,不支持直接传入变量,我需要怎么拿到property属性对应的setter函数?
用到的Settings类代码:
class Settings: def __init__(self): self._name = "Jhon Doe" @property def name(self): return self._name @name.setter def name(self, value): if value.count(" ") > 1: self._name = value
简化后的GUI业务代码:
import pygame import pygame_menu from settings import Settings settings = Settings() pygame.init() surface = pygame.display.set_mode((600, 600)) menu = pygame_menu.Menu('My menu', 600, 600) menu.add.text_input('Name :', default='John Doe', onchange=settings.name) menu.add.button('Quit', pygame_menu.events.EXIT) menu.mainloop(surface)
回答
你现在代码的问题很直接:传settings.name的时候,property的getter逻辑会自动触发,实际传过去的是_name的字符串值,根本不是可调用的函数,当然没法响应输入更新。
两种不需要改动原有类结构的解决方法:
用lambda包装赋值逻辑(最推荐,好懂好写)
lambda只能写表达式,没法直接写settings.name = xxx的赋值语句,用setattr就能完美兼容,它会自动触发property的setter校验逻辑,不需要额外处理:menu.add.text_input('Name :', default='John Doe', onchange=lambda val: setattr(settings, 'name', val))所有Python版本都兼容,后续看代码的人不需要懂property的底层实现,一眼就知道是给settings的name属性赋值。
提取绑定实例的原生setter
类上定义的property对象自带fset属性,存的就是你写的setter原始函数,只要把实例绑定到这个函数上,就能得到直接能用的回调:# 拿到绑定了settings实例的setter方法 name_setter = Settings.name.fset.__get__(settings) menu.add.text_input('Name :', default='John Doe', onchange=name_setter)注意别直接传
Settings.name.fset,这是没绑定实例的裸函数,调用的时候需要手动传self参数,直接传给onchange会报参数数量不对的错。
日常开发优先选第一种lambda写法,维护成本最低。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

