wxPython: исключить ключевые события из TextCtrl, привязанного к EVT_TEXT?

Я кодирую небольшую адресную книгу, ну, она более продвинутая со многими полями ввода и базой данных sqlite. В любом случае, мое главное окно ввода содержит много полей textctrl для столбцов таблицы db. Я собрал небольшую демонстрацию, которая отображает, отображаются ли данные о людях:

# -*- encoding: utf-8 -*-
import wx

class MyWindow(wx.Frame):
def __init__(self, parent):
    noResize_frameStyle = wx.SYSTEM_MENU | wx.CLOSE_BOX | wx.CAPTION

    wx.Frame.__init__(self, parent, -1, title='DEMO', pos=(300, 100),
                      size=(150, 200), style=noResize_frameStyle)

    # Panel
    self.panel = wx.Panel(self)

    # Input Fields
    self.input_1 = wx.TextCtrl(self.panel, size=wx.Size(150, 22), style=wx.TE_PROCESS_ENTER)
    self.input_2 = wx.TextCtrl(self.panel, size=wx.Size(150, 22), style=wx.TE_PROCESS_ENTER)
    self.input_3 = wx.TextCtrl(self.panel, size=wx.Size(150, 22), style=wx.TE_PROCESS_ENTER)
    self.input_4 = wx.TextCtrl(self.panel, size=wx.Size(150, 40), style=wx.TE_MULTILINE | wx.TE_NO_VSCROLL | wx.TE_PROCESS_ENTER)
    self.input_4.evt_run = 0
    self.il = input_list = [self.input_1, self.input_2, self.input_3, self.input_4]

    # Buttons
    self.button_1 = wx.Button(self.panel, label='Clear')
    self.button_2 = wx.Button(self.panel, label='Add Stuff')

    # Binds:
    for entry in input_list:
        entry.string = ''
        entry.Bind(wx.EVT_TEXT, self.OnEdit)
        entry.Bind(wx.EVT_TEXT_ENTER, self.OnEnter)
    self.button_1.Bind(wx.EVT_BUTTON, self.OnClear)
    self.button_2.Bind(wx.EVT_BUTTON, self.OnAddStuff)

    # Sizer
    self.sizer_v = wx.BoxSizer(wx.VERTICAL)
    for entry in input_list:
        self.sizer_v.Add(entry, 0)
    self.sizer_v.Add(self.button_1, 0)
    self.sizer_v.Add(self.button_2, 0)

    # Set Sizer
    self.panel.SetSizerAndFit(self.sizer_v)


def OnClear(self, event):
    for entry in self.il:
        entry.ChangeValue('')
        entry.string = ''
        entry.SetBackgroundColour("White")

def OnAddStuff(self, event):
    string_list = ['Hello', 'World', 'and', 'the whole\nUniverse' ]
    for i,entry in enumerate(self.il):
        entry.ChangeValue(string_list[i])
        entry.string = string_list[i]
        entry.SetBackgroundColour("White")

def compare(self, object):
    # Check if it has been modified
    if object.GetValue() == object.string:
        return 1
    else:
        return 0
    #if object.IsModified():
    #    return 0
    #else:
    #    return 1

def OnEdit(self, events):
    object = events.GetEventObject()
    if self.compare(object):
        print 'is the same'
        object.SetBackgroundColour("White")
    else:
        print 'not the same anymore'
        object.SetBackgroundColour("yellow")

    self.Refresh()

def OnEnter(self, events):
    object = events.GetEventObject()
    # Ignore first ENTER if MultiLine
    if object.IsMultiLine():
        if object.evt_run == 0:
            object.evt_run = + 1
            return
        else:
            object.evt_run = 0
    if self.compare(object):
        return
    result = object.GetValue()
    object.string = result
    print result
    object.SetBackgroundColour("Green")
    self.Refresh()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyWindow(None)
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()

Я связал эти поля ввода с EVT EVT_TEXT, а также с EVT_TEXT_ENTER. Первый вызывает функцию OnEdit, второй - OnEnter. Нажатие на кнопку "Добавить материал" означает, что данные загружены. Теперь редактирование поля приведет к желтому фону, если он не совпадает со значением, полученным из БД.

Я знаю, что для этого есть IsModfied(), но он не обнаружит, если он снова такой же, а также реагирует на CTRL+A, что не то, что я искал. Из-за этого я добавляю строковые данные из базы данных в textctrl, а также атрибут.string для сравнения.

Если вы нажмете ввод в редактируемом поле, он запишет результат в БД, вызовет ChangeValue и сделает фон зеленым. (планируйте делать это только временно, используя таймер в будущем)

Моя проблема в том, что у меня есть многострочные поля в моей базе данных, я также добавил одно для этой демонстрации. Вы можете увидеть мой обходной путь, что он будет игнорировать первый ввод без записи результатов.

Это работает, но решение не велико.

Вы всегда получаете раздражающий звук дин (по крайней мере в Windows), и по какой-то причине событие EVT_TEXT также обнаруживает второй ввод и запускает функцию OnChange, которая мгновенно снова превращает фон в белый цвет.

Есть ли способ это исправить? Можно ли исключить KEY_EVENTS в моей функции OnEdit, которая будет игнорировать клавишу ввода? Может быть, есть лучшая идея сделать то же самое другим способом?

Спасибо за любую помощь.

Мои данные БД UTF-8 Python: 2.7.9 wxPython: 3.0.2.0

0 ответов

Другие вопросы по тегам