Wxpython 了解wx.EVT\u更新\u用户界面

Wxpython 了解wx.EVT\u更新\u用户界面,wxpython,Wxpython,我试图从一本书中学习下面的代码,但我在理解它时遇到了困难。我希望有人能帮助澄清以下问题: 当我在textctrl中没有任何内容时,has_sel设置为false,但是IF stmt如何执行 什么是事件id?这是整个菜单栏的事件id吗 当txt\U ctrl中的项目更改时,为什么事件id会更改 当event.Enable(has_sel)为true时,如何启用/禁用这两个按钮 代码如下: import wx ID_CHECK_ITEM = wx.NewId() class TextFram

我试图从一本书中学习下面的代码,但我在理解它时遇到了困难。我希望有人能帮助澄清以下问题:

  • 当我在textctrl中没有任何内容时,has_sel设置为false,但是IF stmt如何执行
  • 什么是事件id?这是整个菜单栏的事件id吗
  • 当txt\U ctrl中的项目更改时,为什么事件id会更改
  • 当event.Enable(has_sel)为true时,如何启用/禁用这两个按钮
代码如下:

import wx

ID_CHECK_ITEM = wx.NewId()

class TextFrame(wx.Frame):
    def __init__(self, parent, *args, **kwargs):
        super(TextFrame, self).__init__(parent,
                                        *args,
                                        **kwargs)

        # Attributes
        self.panel = wx.Panel(self)
        self.txtctrl = wx.TextCtrl(self.panel,
                                   value="Hello World",
                                   style=wx.TE_MULTILINE)

        # Layout
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.txtctrl, 1, wx.EXPAND)
        self.panel.SetSizer(sizer)
        self.CreateStatusBar() # For output display

        # Menu
        menub = wx.MenuBar()
        editm = wx.Menu()
        editm.Append(wx.ID_COPY, "Copy\tCtrl+C")
        editm.Append(wx.ID_CUT, "Cut\tCtrl+X")
        editm.Append(ID_CHECK_ITEM, "Selection Made?",
                     kind=wx.ITEM_CHECK)
        menub.Append(editm, "Edit")
        self.SetMenuBar(menub)

        # Event Handlers
        self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateEditMenu)

    def OnUpdateEditMenu(self, event):
        event_id = event.GetId()
        sel = self.txtctrl.GetSelection()
        print("Start")
        print('Sel',sel)
        has_sel = sel[0] != sel[1]
        print('has_sel=',has_sel)
        print('sel[0]=',sel[0])
        print('sel[1]=',sel[1])
        print('event_id=',event_id)
        print('wx.ID_COPY',wx.ID_COPY)
        print('wx.ID_CUT=',wx.ID_CUT)
        print('ID_CHECK_ITEM=',ID_CHECK_ITEM)
        if event_id in (wx.ID_COPY, wx.ID_CUT):
            print("Select option set to true-1")
            event.Enable(has_sel)
        elif event_id == ID_CHECK_ITEM:
            print("Select option set to true-2")
            event.Check(has_sel)
        else:
            event.Skip()

这似乎是一个教程。既然这段代码是从一本书中得到的,我猜这本书应该包含对代码的解释。那是你首先应该找的地方

下一步,了解事件的作用以及它的方法可能会有所帮助。文档中说,此事件触发是为了“让应用程序有机会更新各种用户界面元素”。例如,打开菜单时,必须绘制菜单,但不需要更新整个应用程序

现在回答您的问题:

1。当我在textctrl中没有任何内容时,has_sel设置为false,但是IF stmt如何执行?
实际上,你不是在检查文本Ctrl中的内容,而是在检查突出显示的内容。正在调用的方法是
GetSelection()
。查看,我们可以看到此方法返回高亮显示(或“选定”)文本的起始索引和结束索引。显然,如果起点和终点位于同一位置,则不会进行选择。要获取实际文本,我们需要调用
GetValue()
。当然,如果textctrl为空,则不能选择任何文本

至于问题的第二部分,所选文本与if语句无关。if语句只检查事件的ID(我将在下面解释),而不是选择。选择用于决定是否应启用复制和剪切,但
的值has_sel
根本不会影响if语句

2。什么是事件id?它是整个菜单栏的事件id吗?
在WxPython中,可以使用对象的ID来区分对象。例如,如果我有两个按钮,“保存”和“取消”,您希望它们在单击时执行不同的操作。如果我们只使用
wx.EVT_按钮
,那么我们无法区分按钮,因为这两个按钮都创建了该事件。这就是ID派上用场的地方。正如您在代码中看到的,事件有一个
GetID()
方法。这将返回创建事件的对象的ID。所以使用这个,如果我们知道“保存”和“取消”的ID,我们可以检查用户单击了哪个按钮

wx.EVT\u UPDATE\u UI
的情况下,
GetID()
将返回正在更新的对象的ID。它不是事件本身的ID。在您的代码中,
editm
中的项目正在更新。查看每个项目如何具有自己的ID?这导致我们

3。当txt\u ctrl中的项目更改时,事件id为什么会更改?
看看我之前的答案,你应该能够自己回答这个问题。该事件与textctrl无关。是的,我们正在签入textctrl的选择,但这不是导致事件的原因。正在发生的是
editm
中试图更新的各个项目,因此每个项目都发送自己的
wx.EVT\u update\u UI
。ID将根据发送事件的菜单项进行更改

4。当event.Enable(has_sel)为true时,如何启用/禁用这两个按钮?

如果查看,您会看到
Enable(Enable)
使用事件的ID来启用或禁用相应的菜单项<代码>has_sel仅在选中文本时才为
True
,因此
事件。如果选中文本,启用(has_sel)
将启用创建事件的对象,否则禁用它。记住,“复制”和“剪切”都会创建各自独立的
wx.EVT\u UPDATE\u UI
事件,因此
Enable(has\u sel)
在两个菜单项上都被调用。

Great