我刚开始学习Python,所以我尽量避免在python2中工作太多。目前正在使用wxPython学习GUI元素。Python3文档还没有介绍部分,所以我使用Python2“入门”文档并在需要时转换为Python3。在
我现在在this section。有一部分wx.EVT_字符用于在聚焦对象上检测到按键时的事件处理。我在comparison chart,或在CommandEvent docs,或在{a4}的“由这个类引发的事件”部分中没有看到对它的引用。我已经能够转换大多数其他非python3代码,比如SizerFlags,但是我找不到与之对应的代码。在
这就是我的工作。在
import wx
class ExampleFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
baseSizer = wx.BoxSizer(wx.VERTICAL)
# Create an editable text field
self.textfield = wx.TextCtrl(self)
# Attach event handlers to text field
# Event for when the text changes
self.Bind(wx.EVT_TEXT, self.OnChange, self.textfield)
# Event for when a key is pressed, for example an arrow key should fire this event but not the EVT_TEXT event
self.Bind(wx.EVT_CHAR, self.OnKeyPress, self.textfield)
# Create a button that will clear the textfield
clearButton = wx.Button(self, wx.ID_CLEAR, "Clear")
# Attach event handler on the clearButton to call OnClear()
self.Bind(wx.EVT_BUTTON, self.OnClear, clearButton)
# Multiline text field for seeing the events fire
self.logger = wx.TextCtrl(self, -1, style= wx.TE_MULTILINE | wx.TE_READONLY )
# Add items to frame sizer
baseSizer.Add(self.textfield, wx.SizerFlags(0).Expand())
baseSizer.Add(clearButton, wx.SizerFlags(0).Expand())
baseSizer.Add(self.logger, wx.SizerFlags(1).Expand())
# Set sizer for frame
self.SetSizer(baseSizer)
# Show
self.Show()
def OnClear(self, e):
# Clear all text entered into the textfield and return focus
self.textfield.SetValue("")
self.textfield.SetFocus()
def OnChange(self, e):
# Log every time this event is fired
self.logger.appendText("OnChange: " + e.GetString() + '\n')
def OnKeyPress(self, e):
# Log every key press in the textfield
self.logger.AppendText("OnKeyPress: " + e.GetKeyCode() + '\n')
app = wx.App(False)
ExampleFrame(None)
app.MainLoop()
每次textfield中的文本发生更改时,OnChange()
都将触发。OnKeyPress
从不触发。但是,如果我让它启动,那么在CommandEvent methods summary中没有GetKeyCode()等价物。在
编辑: 由于Mike Driscoll,问题得以解决。我实施了他的改变,就是要改变这一点:
^{pr2}$为此:
self.textfield.Bind(wx.EVT_CHAR, self.OnKeyPress, self.textfield)
另外,我还必须将e.Skip()
添加到OnKeyPress
函数中。否则,它会记录该键,但不会向textfield添加文本。其他事件在没有Skip()
向上传递事件到其他侦听器的情况下也很正常。在
在本例中,您只是错误地绑定了事件。你想要吗
而不是
^{pr2}$这里是在上下文中:
您可能需要阅读以下关于差异绑定方法的wiki条目:
至于你的另一个问题,虽然我不能确定,但如果凤凰城不存在OnKeyPress,我会非常惊讶。我会尝试一下,即使它不在文档中,因为我猜它仍然在那里。在
相关问题 更多 >
编程相关推荐