1

我正在尝试遵循书中的以下代码,但我无法理解它。我希望有人可以帮助澄清以下问题:

  • 当我在 textctrl 中什么都不做时,has_sel 设置为 false 但是 IF stmt 如何执行?
  • 什么是 event_id?它是整个菜单栏的 event_id 吗?
  • 为什么 txt_ctrl 中的项目更改时 event_id 会更改?
  • 当 event.Enable(has_sel) 为真时,这两个按钮是如何启用/禁用的?

这是代码:

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()
4

1 回答 1

3

这似乎是一个教程。由于您从一本书中获得了此代码,因此我猜测同一本书应该包含对代码的解释。那是您应该寻找的第一个地方。

接下来,查看wx.EVT_UPDATE_UI的文档可能会有所帮助,以便更好地了解此事件的作用及其方法。文档说这个事件触发“让应用程序有机会更新各种用户界面元素”。例如,当您打开一个菜单时,必须绘制菜单但整个应用程序不需要更新。

现在为您的问题:

1. 当我在 textctrl 中什么都不做时,has_sel 设置为 false,但是 IF stmt 是如何执行的?
实际上,您不是在检查 textctrl 中的内容,而是在检查它highlight的内容。被调用的方法是GetSelection(). 查看wx.TextCtrl 文档,我们可以看到此方法返回突出显示(或“选定”)文本的开始和结束索引。显然,如果开始和结束在同一个地方,则不会进行选择。要获得我们需要调用的实际文本GetValue()。当然,如果 textctrl 为空,那么您将无法选择任何文本!

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

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

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

3. 为什么txt_ctrl中的item发生变化时event_id会发生变化?
看了我之前的回答,你应该可以自己回答这个问题了。该事件与 textctrl 无关。是的,我们正在检查textctrl 的选择,但这不是导致事件的原因。正在发生的editm是尝试更新的单个项目,因此每个项目都发送它自己的wx.EVT_UPDATE_UI. ID 根据发送事件的菜单项而变化。

4、当event.Enable(has_sel)为真时,两个按钮是如何启用/禁用的?
如果您查看wx.EVT_UPDATE_UI 文档,您会看到Enable(enable)使用事件 ID 来启用或禁用相应的菜单项。has_selTrue在选择文本时,因此event.Enable(has_sel)如果选择了文本,则启用创建事件的对象,否则禁用它。请记住,“复制”和“剪切”都创建了自己的单独wx.EVT_UPDATE_UI事件,因此Enable(has_sel)在两个菜单项上都会调用。

于 2012-08-27T02:46:31.203 回答