python - 我必须创建一个类属性来获取 TextCtrl 的输入,它可以是本地的吗?
问题描述
这是原始代码,我在其中创建了一个wx.TextCtrl
attributes self.tc1
,绑定事件工作正常:
import wx
class Example(wx.Frame):
def __init__(self, title):
super().__init__(None, title=title)
self.panel = wx.Panel(self)
self.tc1 = None
self.initUI()
def initUI(self):
sizer = wx.GridBagSizer(2, 2)
self.set_name(sizer)
self.panel.SetSizer(sizer)
sizer.Fit(self)
def set_name(self, sizer):
text1 = wx.StaticText(self.panel, label="Enter your name:")
sizer.Add(text1, pos=(0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=10)
self.tc1 = wx.TextCtrl(self.panel, style=wx.TE_CENTER, value="enter_name_here")
self.tc1.Bind(wx.EVT_TEXT, self.on_get_text)
sizer.Add(self.tc1, pos=(0, 1), flag=wx.TOP|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=5)
def on_get_text(self, e):
print(self.tc1.GetValue())
if __name__ == '__main__':
app = wx.App()
Example("Example").Show()
app.MainLoop()
如果我想让文本控件self.tc1
成为方法的局部变量self.set_name
怎么办,因为我不想用太多属性污染类。需要明确的是,如果我以self.set_name
这种方式更改方法,则将tc1
局部变量设为该方法:
def set_name(self, sizer):
text1 = wx.StaticText(self.panel, label="Enter your name:")
sizer.Add(text1, pos=(0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=10)
tc1 = wx.TextCtrl(self.panel, style=wx.TE_CENTER, value="enter_name_here")
# tc1.Bind(wx.EVT_TEXT, self.on_get_text)
sizer.Add(tc1, pos=(0, 1), flag=wx.TOP|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=5)
如何修改 Bind 方法以达到相同的效果?我的类中有太多的小部件,我真的不想让它们中的每一个都成为类属性。
解决方案
传递给处理程序的 EVT_TEXT 事件包含对其绑定的对象的引用。要获取该对象,请调用GetEventObject()
def on_get_text(self, event):
tc1 = event.GetEventObject()
print(tc1.GetValue())
推荐阅读
- python - 如何在pandas groupby中获得最少的值出现次数
- google-cloud-platform - 谷歌云功能端点在伊朗被封锁
- codenameone - 如何将给定范围内所有单元格中的值相加
- python - 使用字典和 for 循环调用 tf2 模型时出现意外警告
- r - 使用 date_break 命令绘制 x 轴级别时如何解决日期问题?
- sql - 当您在 Oracle 中删除附加了外键的主键约束然后重新启用主键时会发生什么?
- php - 如何阻止 Android 上的 chrome 浏览器破坏 PHP 会话?
- javascript - 将清单转换为下拉列表
- python - 是什么破坏了 FastAPI 的 Swagger UI?- 它停止工作并在名为“default”的组下显示 API 调用
- python - 如何将 css 类包含到 django 表单中