Ich verwende die WX-Bibliothek, um eine GUI zu erstellen. Ich habe ein Panel initialisiert und einige Drucktasten initialisiert und binde eine Funktion, die beim Drücken ausgeführt wird. Die Funktion benötigt eine Liste von Argumenten, von denen eines eine Callback-Funktion ist. Was ich versuche, ist die Callback-Funktion während der Laufzeit neu zu definieren, aber ich versäume es.Neudefinieren eines aufrufbaren Objekts während der Laufzeit
Mein Versuch, so weit ist:
self.UpdateCurrent = None
self.GetCurrent = None
self.UpdateCellVoltage = None
self.GetCellVoltage = None
self.UpdateCellTemperature = None
self.GetCellTemperature = None
self.battery_control_d = OrderedDict([('Current',[self.UpdateCurrent, self.GetCurrent, None, 1]),
('Cell Voltage',[self.UpdateCellVoltage, self.GetCellVoltage, 0, 24]),
('Cell Temperature',[self.UpdateCellTemperature, self.GetCellTemperature, 0, 24])])
.
.
.
submit_btn_l[-1].Bind(wx.EVT_BUTTON,
lambda evt,
io_name = io_name,
callback_fn = self.battery_control_d[io_name][0],
ctrl_textbox = ctrl_textbox,
dim_combobox = self.dim_combobox_l[-1]:
self._send_control_value(evt,
io_name,
callback_fn,
ctrl_textbox,
dim_combobox))
.
.
.
def init_battery_intf(self):
self.battery_intf = self.simulator_main_panel.battery_intf
self.UpdateCurrent = self.battery_intf.UpdateCurrent
self.GetCurrent = self.battery_intf.GetCurrent
self.UpdateCellVoltage = self.battery_intf.UpdateCellVoltage
self.GetCellVoltage = self.battery_intf.GetCellVoltage
self.UpdateCellTemperature = self.battery_intf.UpdateCellTemperature
self.GetCellTemperature = self.battery_intf.GetCellTemperature
.
.
.
def _send_control_value(self,
evt,
io_name,
callback_fn,
ctrl_textbox,
dim_combobox):
io_value = float(ctrl_textbox.Value)
if ("Temperature" in io_name):
io_value -= self.simulator_main_gui.temperature_unit_converter
callback_fn(io_value, int(dim_combobox.Value))
def update(self,
evt):
for io_name, io_info in self.battery_control_d.iteritems():
io_value = float(io_info[1](io_info[2]))
self.reading_text_l[self.io_indexer.index(io_name)].SetLabel(" %.4f " % (io_value))
ich vordefinieren einige Aktualisierung/Objekte bekommen.
Ich binde die Funktion zu den Tasten
Während der Laufzeit ich init_battery_intf nennen diese Objekte
Die Linie, die Fehler aus zu initialisieren ist, wenn ich versuche, die Callback-Funktion aufzurufen. Es scheint immer noch auf Keine eingestellt zu sein.
Traceback (most recent call last):
File "C:\Users\Sam\Desktop\work\simulator\src\simulate.py", line 1185, in updat
self.control_notebook.update(evt)
File "C:\Users\Sam\Desktop\work\simulator\src\simulate.py", line 869, in update
self.battery_control_panel.update(evt)
File "C:\Users\Sam\Desktop\work\simulator\src\simulate.py", line 591, in update
io_value = float(io_info[1](io_info[2]))
TypeError: 'NoneType' object is not callable
Ich weiß, ich könnte die binden und Futtermittel in den Werten direkt neu zu definieren, aber ich wollte meinen Code sauber und einfach zu halten, und ich fühle mich wie Python eine Art und Weise hat die neu definierte Callback-Funktion auf alle Instanzen zu verteilen das Objekt.
Ich benutze Python 2.7.
bitte zeigen der gesamte Traceback, hilft es wirklich zu wissen, welche Zeilen im Code zu einem Problem führen. –
@ TadhgMcDonald-Jensen Hinzugefügt Tracelog und die Funktion, wo der Fehler auftritt. – Sam
Ist 'io_info [1]' was Sie erwarten, um eine Rückruffunktion zu sein? Das ist der Ausdruck, der zu "None" führt und nicht aufgerufen werden kann. – dsh