Изменить значение TextBox matplotlib без вызова обратного вызова - PullRequest
0 голосов
/ 16 мая 2019

Например, у меня есть Slider с обратным вызовом, установленным через on_changed().У меня есть возможность изменить значение Slider с помощью set_val() без вызова обратного вызова, установив eventson в False перед установкой значения.

Однако, если я установлю eventson в False для TextBox, затем обновите значение с помощью set_val(), обратный вызов on_submit() все еще срабатывает.

Исходный код моей версии Matplotlib проверяет это:

Для TextBox:

def set_val(self, val):
    newval = str(val)
    if self.text == newval:
        return
    self.text = newval
    self.text_disp.remove()
    self.text_disp = self._make_text_disp(self.text)
    self._rendercursor()
    self._notify_change_observers()
    self._notify_submit_observers()

Для Slider:

def set_val(self, val):
    """
    Set slider value to *val*

    Parameters
    ----------
    val : float
    """
    xy = self.poly.xy
    xy[2] = val, 1
    xy[3] = val, 0
    self.poly.xy = xy
    self.valtext.set_text(self.valfmt % val)
    if self.drawon:
        self.ax.figure.canvas.draw_idle()
    self.val = val
    if not self.eventson:
        return
    for cid, func in self.observers.items():
        func(val)

Есть ли предпочтительный способ сделать это?

1 Ответ

0 голосов
/ 16 мая 2019

Это грязное решение, но вы можете "monkey patch" класс TextBox, чтобы вместо этого вызывать свой собственный set_val (). К сожалению, я не знаю, может ли это иметь непредвиденные последствия.

from matplotlib.widgets import TextBox

def set_val(self, val):
    newval = str(val)
    if self.text == newval:
        return
    self.text = newval
    self.text_disp.remove()
    self.text_disp = self._make_text_disp(self.text)
    self._rendercursor()
    if self.eventson:
        self._notify_change_observers()
        self._notify_submit_observers()

TextBox.set_val = set_val

(...)

tbox1 = TextBox(tax1, 'Text Box 1')
tbox1.on_submit(...)

tbox1.eventson = False
tbox1.set_val('test')
tbox1.eventson = True

plt.show()

В качестве альтернативы, для лучшего долгосрочного решения, вы могли бы поднять проблему или сделать запрос на выборку по адресу tracker matplotlib Неважно, я вижу, вы уже подняли проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...