1

以下の本のコードをたどろうとしていますが、理解するのに苦労しています。私は誰かが次の問題を明確にするのを手伝ってくれることを望んでいました:

  • textctrlに何も含まれていない場合、has_selはfalseに設定されますが、IF stmtはどのように実行されますか?
  • event_idとは何ですか?メニューバー全体のevent_idですか?
  • txt_ctrlの項目が変更されたときにevent_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()
4

1 に答える 1

3

これはチュートリアルのようです。このコードは本から入手したので、同じ本にコードの説明が含まれているはずだと推測します。それはあなたが見るべき最初の場所です。

次に、wx.EVT_UPDATE_UI のドキュメントを参照して、このイベントが何を行い、そのメソッドが何であるかをよりよく理解することをお勧めします。ドキュメントによると、このイベントは「アプリケーションにさまざまなユーザー インターフェイス要素を更新する機会を与える」ためにトリガーされます。たとえば、メニューを開くとき、メニューを描画する必要がありますが、アプリケーション全体を更新する必要はありません。

さて、あなたの質問のために:

1. textctrl で何もしないと、has_sel が false に設定されますが、IF stmt はどのように実行されますか?
実際には、textctrl の内容を確認しているのではなく、強調表示されている内容を確認しています。呼び出されるメソッドはGetSelection(). wx.TextCtrl のドキュメントを見ると、このメソッドが強調表示された (または「選択された」) テキストの開始インデックスと終了インデックスを返すことがわかります。明らかに、開始と終了が同じ場所にある場合、選択は行われません。実際のテキストを取得するには、 を呼び出す必要がありますGetValue()。もちろん、textctrl が空の場合、テキストを選択することはできません!

質問の 2 番目の部分については、選択したテキストは if ステートメントとは関係ありません。if ステートメントは、選択ではなく、イベントの ID (以下で説明します) をチェックするだけです。選択、コピーとカットを有効にするかどうかを決定するために使用されますが、の値はhas_selif ステートメントにはまったく影響しません。

2. event_id とは? メニューバー全体の event_id ですか?
WxPython では、ID を使用してオブジェクトを区別します。たとえば、「保存」と「キャンセル」の 2 つのボタンがある場合、クリックしたときに異なるアクションを実行する必要があります。のみを使用するwx.EVT_BUTTONと、両方のボタンがそのイベントを作成するため、ボタンを区別できません。ここで ID が役に立ちます。コードでわかるように、イベントにはGetID()メソッドがあります。これは、イベントを作成したオブジェクトの ID を返します。これを使って、「保存」と「キャンセル」のIDがわかれば、ユーザーがどのボタンをクリックしたかを調べることができます。

の場合、wx.EVT_UPDATE_UI更新GetID()中のオブジェクトの ID を返します。イベント自体の ID ではありません。あなたのコードでは、内部のアイテムeditmが更新されています。各アイテムが独自の ID を持っているのがわかりますか? これは私たちを導きます...

3. txt_ctrl の項目が変更されると event_id が変更されるのはなぜですか?
私の以前の回答を見ると、この質問に自分で答えることができるはずです。イベントは textctrl とは関係ありません。はい、textctrl の選択をチェックインしていますが、それがイベントの原因ではありません。起こっているのは、editm更新しようとしている個々のアイテムであるため、各アイテムは独自の を送信しますwx.EVT_UPDATE_UI。ID は、どのメニュー項目がイベントを送信したかに基づいて変化します。

4. event.Enable(has_sel) が true の場合、両方のボタンがどのように有効/無効になりますか? wx.EVT_UPDATE_UI ドキュメントを見ると
、イベントの ID を使用して適切なメニュー項目を有効または無効にしていることがわかります。テキストが選択されている場合のみです。したがって、テキストが選択されている場合はイベントを作成したオブジェクトが有効になり、それ以外の場合は無効になります。「コピー」と「カット」の両方が独自の個別のイベントを作成するため、両方のメニュー項目で呼び出されることに注意してください。Enable(enable)has_selTrueevent.Enable(has_sel)wx.EVT_UPDATE_UIEnable(has_sel)

于 2012-08-27T02:46:31.203 に答える