我正在编写一个小地址簿,它有点更先进的许多输入字段和一个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