有没有wx.EVT_字符或者事件.GetKeyCode()wxPython(凤凰城)的等价物?

2024-10-01 09:18:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学习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()向上传递事件到其他侦听器的情况下也很正常。在


Tags: thetextselfeventforbinddefevt
1条回答
网友
1楼 · 发布于 2024-10-01 09:18:25

在本例中,您只是错误地绑定了事件。你想要吗

self.textfield.Bind(wx.EVT_CHAR, self.OnKeyPress, self.textfield)

而不是

^{pr2}$

这里是在上下文中:

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.textfield.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, 1, flag=wx.EXPAND)
        baseSizer.Add(clearButton,0)
        baseSizer.Add(self.logger, 1, flag=wx.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()
        e.Skip()

    def OnChange(self, e):
        # Log every time this event is fired
        self.logger.AppendText("OnChange: " + e.GetString() + '\n')
        e.Skip()

    def OnKeyPress(self, e):
        # Log every key press in the textfield
        self.logger.AppendText("OnKeyPress: " + str(e.GetKeyCode()) + '\n')
        e.Skip()

app = wx.App(False)
ExampleFrame(None)
app.MainLoop()

您可能需要阅读以下关于差异绑定方法的wiki条目:

至于你的另一个问题,虽然我不能确定,但如果凤凰城不存在OnKeyPress,我会非常惊讶。我会尝试一下,即使它不在文档中,因为我猜它仍然在那里。在

相关问题 更多 >