wxPython:从绑定到EVT_TEXT的TextCtrl中排除关键事件?

时间:2015-06-30 19:05:50

标签: python-2.7 wxpython wx.textctrl

我正在编写一个小地址簿,它有点更先进的许多输入字段和一个sqlite数据库。 无论如何,我的主输入窗口包含许多用于db表的列的textctrl字段。 我整理了一个反映人员数据是否显示的小演示:

# -*- 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()

我将这些输入字段绑定到wx EVENT EVT_TEXT以及EVT_TEXT_ENTER。第一个调用函数OnEdit第二个函数OnEnter。按下按钮"添加东西"反映人员数据被加载。 现在编辑一个字段将导致黄色背景,如果它与从DB获得的值不一样。

我知道有IsModfied()这样做但是这个不会再次检测到它是否相同并且也对CTRL + A做出反应,这不是我想要的。因此,我将数据库中的字符串数据添加到textctrl以及.string属性进行比较。

如果在已编辑的字段上按Enter键,它会将结果写入数据库,调用ChangeValue并将背景变为绿色。 (计划将来只使用计时器暂时执行此操作)

我的问题是我的数据库中有多行字段,我也为此演示添加了一个。您可以看到我的解决方法,它将忽略第一次输入而不编写结果。

这有效,但解决方案并不好。

你总是得到令人讨厌的叮当声(至少在Windows上)并且由于某种原因,EVT_TEXT事件会检测到第二个输入并运行OnChange功能,这将立即再次将背景变为白色。

有没有办法解决这个问题?是否可以在我的OnEdit函数中排除将忽略Enter键的KEY_EVENTS? 也许有更好的想法来实现相同的另一种方式?

感谢您的帮助。

我的数据库数据是UTF-8 Python:2.7.9 wxPython:3.0.2.0

0 个答案:

没有答案