在使用wxpython时我们经常需要为部件绑定功能。
我以为当存在多个需要绑定相同功能的部件时,存在以下几种方法:
一、一个部件绑定一个功能
二、都绑定到同一个功能,再在函数中进行判断触发的部件是哪一个
第一种十分浪费时间精力,而且会大幅度增长代码。
本篇文章简单的描述一下第二种方法
class main_label():
def __init__(self):
app = wx.App() #创建wx对象
frame = wx.Frame(None, title="我是帅比", size=(600, 225))
self.text1 = wx.StaticText(frame, -1, '文本1', pos=(150, 30))
self.textctrl1 = wx.TextCtrl(frame, -1, u'123', pos=(150, 55), size=(260, 25)) #文本框1
self.inputbt1 = wx.Button(frame, -1, '导入', pos=(415, 55), size=(70, 25))
self.text2 = wx.StaticText(frame, -1, '文本2', pos=(150, 85))
self.textctrl2 = wx.TextCtrl(frame, -1, u'123', pos=(150, 105), size=(260, 25))
self.inputbt2 = wx.Button(frame, -1, '导入', pos=(415, 105), size=(70, 25))
self.inputbt3 = wx.Button(frame, -1, '生成request', pos=(150, 140), size=(130, 30))
self.inputbt4 = wx.Button(frame, -1, 'Mapping', pos=(360, 140), size=(130, 30))
textctrl_list_str=['self.textctrl{}'.format(i) for i in range(1,3)] #将对象名以字符串形式储存
button_list_str=['self.inputbt{}'.format(i) for i in range(1,3)]
self.textctrl_list=[]
for i in textctrl_list_str:
self.textctrl_list.append(eval(i)) #通过eval将字符串重新转为对象
self.button_list=[]
for i in button_list_str:
self.button_list.append(eval(i))
self.inputbt1.Bind(wx.EVT_BUTTON, self.input_xlsx)
# self.inputbt3.Bind(wx.EVT_BUTTON, self.filling)
for t in self.textctrl_list:
t.Bind(wx.EVT_LEFT_DCLICK, lambda x,textctrl =t:self.textctrl_k(event=x,textctrl=textctrl)) #为对象绑定功能
for t in self.button_list:
t.Bind(wx.EVT_BUTTON, lambda x,textctrl =t:self.input_xlsx(event=x,textctrl=textctrl))
frame.SetBackgroundColour('white')
frame.Show()
app.MainLoop()
def input_xlsx(self, event,textctrl):
index_num = self.button_list.index(textctrl) #获得触发部件的索引
btn = event.GetEventObject()
btn.Disable()
files = "EXCEL工作簿(*.xlsx;*.xls)|*.xlsx;*.xls|" "EXCEL工作簿(*.xlsx)|*.xlsx|" "EXCEL工作簿(*.xls)|*.xls"
file_dir = wx.FileDialog(None, message="选择导入路径", wildcard=files, style=wx.FD_OPEN)
if file_dir.ShowModal() == wx.ID_OK: # wx.ID_OK是判断结果,并执行相应程序
self.textctrl_list[index_num].SetValue(file_dir.GetPath()) #设定按键对应文本框内容
btn.Enable()
def textctrl_k(self, event, textctrl):
index_num = self.textctrl_list.index(textctrl)
if "123" in self.textctrl_list[index_num].GetValue():
self.textctrl_list[index_num].ChangeValue("")
self.textctrl_list[index_num].SetFocus()
if self.textctrl_list[index_num].GetValue() != "":
self.textctrl_list[index_num].Unbind(wx.EVT_LEFT_DOWN)