2

wxPython GUIを開発していますが、ショートカットテキストを右揃えにします。明らかに、タブ文字を使用してこれを判断することができますが、方法があれば、ネイティブに実行することをお勧めします。

したがって、デフォルトのメニュー項目の作成は次のとおりです。

menu = wx.Menu()
item_id = 1
item_name = 'My menu item'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

これをショートカットで拡張するので、タブを使用している場合は、次のようになります。

item_name = 'My menu item\t\tCtrl+Alt+H'

\tただし、すべてを確実に並べるために多くの手動入力が必要であり、メニュー項目の名前が変更されたり、別の項目が追加されたりするたびに、それらすべてを更新する必要が生じる可能性があります。これを回避する方法はありますか?たとえば、キーバインドをメニュー項目に自動的に関連付けるために表示されていないクラスメソッドはありますか?

編集:のようなテキストを渡すとき、アクセラレータテーブルにそのIDに関連付けられた定義がある場合、指定されたIDに関連付けられたキーバインディングで自動的に何かを行うことを知って&My menu itemいますか?

4

2 に答える 2

2

私は答えを見つけるために他のいくつかのアプリケーションのコードを掘り下げました。のデフォルトの動作は、見た目\tどおりには機能しません(つまり、タブ文字を挿入します)が、ツールキットによって、私がやりたいことを正確に実行していると賢明に解釈されます。したがって、ショートカットを右揃えにする方法は簡単です。必要なテキストを使用してショートカットを作成し、その後に(上記のように)続けます。上記で貼り付けたサンプルコードでは、ショートカットをにしたければ、次のようになります。\t<shortcut>Ctrl + T

menu = wx.Menu()
item_id = 1
item_name = 'My menu item\tCtrl+T'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

編集: MikeDriscollの非常に役立つ回答に基づいて次のセクションを更新しました。

これによりショートカットバインディングが作成されますが(wxPythonがそれを取得します)、WindowsのAltキーなどを使用して選択できるようにはなりません。

Altキーを関連付けると、メニューをすばやく開いて、テキスト内のアンパサンドを使用してメニューに移動できますが、 :を使用item_nameして目的のキーバインドを手動で関連付ける必要があります。AcceleratorTable

menu = wx.Menu()
item_id = 1

# Ctrl+T is bound to the keybinding
accelerator_table = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('T'), item_id)])
self.setAcceleratorTable(accelerator_table)

# Ctrl+T is not included, but the menu item can be accessed via Alt key
item_name = '&My menu item'

help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

これは、実際には好ましいパターンであると思います。参照された場所であればどこでもitem_id、ショートカットが自動的に参照される可能性があるためです。これにより、シームレスな更新も可能になります。

于 2013-03-21T16:25:25.283 に答える
1

クリスはメニューでキーバインドを正しく「\t」インデントすることについて正しいのですが、アンパサンドを使用して何かを自動的に関連付けることによって彼が何を意味するのかは実際にはわかりません。アンパサンド(&)を使用すると、ALTを入力して[ファイル]メニューを開くことができます。アンパサンドが適用された別の文字を入力すると、そのメニュー項目にジャンプしますが、&は接続されません。アクセラレータテーブルへのメニュー項目。これは、メニュー項目のIDを介して行われます。

次のコードを参照してください。

import wx

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")

        self.panel = wx.Panel(self, wx.ID_ANY)

        menuBar = wx.MenuBar()
        fileMenu = wx.Menu()
        exitId = wx.NewId()
        exitMenuItem = fileMenu.Append(exitId, "&Exit/tCtrl+X",
                                       "Exit the application")
        self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
        menuBar.Append(fileMenu, "&File")
        self.SetMenuBar(menuBar)

        accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL,  ord('X'), exitId )])
        self.SetAcceleratorTable(accel_tbl)

    #----------------------------------------------------------------------
    def onExit(self, event):
        """"""
        self.Close()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

exitIdは、メニュー項目を作成し、メニュー項目をEVT_MENUにバインドするために使用され、最後に、ユーザーがショートカットキーを使用できるようにAcceleratorTableで使用されることに注意してください。

ここに役立つかもしれないいくつかの参考文献があります:

于 2013-03-21T17:51:04.037 に答える