Si vous voulez désactiver les touches de l'accélérateur, SetAcceleratorTable fonctionne par ex. ici j'utilise SetAcceleratorTable pour désactiver les touches de l'accélérateur, pour désactiver les touches de raccourci est un peu difficile, j'utilise une manière hacky de changer tous les textes de menu, mais le menu principal ouvre encore sur alt-m mais repos sont désactivés. Aletrnatively je pense que vous pouvez attraper EVT_CHAT/EVT_KEY_UP pour l'image et son enfant et bloquer facilement les événements, mais là, vous devrez faire attention.
import wx
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, style=wx.DEFAULT_FRAME_STYLE|wx.WS_EX_PROCESS_UI_UPDATES,
parent=None,size=(400,300))
self._setMenu()
self.Show()
self._menuTextMap = {}
self.btn = wx.Button(self, -1, "Disable Accel")
self.btn.Bind(wx.EVT_BUTTON, self._toggleAccel)
def _enableMenuShortcuts(self, enable):
if enable and not self._menuTextMap:
return
def enableMenu(menuItem, i=-1):
if i==-1:#item
text = menuItem.GetText()
else:#menu
text = self.menuBar.GetLabelTop(i)
if enable:
print text,
newText = self._menuTextMap[text]
print newText
else:
newText = text.replace('&','')+" disabled"
self._menuTextMap[newText] = text
if i:
menuItem.SetText(newText)
else:
self.menuBar.SetLabelTop(i,newText)
for i in range(self.menuBar.GetMenuCount()):
menu = self.menuBar.GetMenu(i)
enableMenu(menu, i)
for menuItem in menu.GetMenuItems():
enableMenu(menuItem)
def _toggleAccel(self, event):
self.accelOn = not self.accelOn
if self.accelOn:
self.SetAcceleratorTable(self.aTable)
self._enableMenuShortcuts(True)
self.btn.SetLabel("Disable Accel")
else:
self.SetAcceleratorTable(wx.NullAcceleratorTable)
self._enableMenuShortcuts(False)
self.btn.SetLabel("Enable Accel")
#self.menuBar.SetAcceleratorTable(wx.NullAcceleratorTable)
def _setMenu(self):
self.menuBar = wx.MenuBar()
myMenu= wx.Menu()
accelList = []
for i in range(9):
ID = wx.NewId()
myMenu.Append(ID, "Item &%s"%(i+1))
wx.EVT_MENU(self, ID, self._onMenu)
accelList.append((wx.ACCEL_CTRL, ord('A')+i, ID))
self.menuBar.Append(myMenu, "&My Menu")
self.SetMenuBar(self.menuBar)
self.accelOn=True
self.aTable = wx.AcceleratorTable(accelList)
self.SetAcceleratorTable(self.aTable);
def _onMenu(self, event):
item = self.menuBar.GetMenu(0).FindItemById(event.GetId())
wx.MessageBox("Menu -> %s"%(item.GetItemLabel(),))
app = wx.PySimpleApp()
app.SetTopWindow(MainFrame())
app.MainLoop()
Vous avez dit EVT_UPADTE_UI
peut fonctionner si vous connaissez tous les ids, pour que vous pouvez juste boucle à travers tous les éléments de menu
for i in range(self.menuBar.GetMenuCount()):
menu = self.menuBar.GetMenu(i)
enableMenu(menu, i)
for menuItem in menu.GetMenuItems():
enableMenu(menuItem)
qui OS que vous ciblez? ou est-ce multi-plateforme? –
cross plate-forme, même si la grande majorité de nos utilisateurs sont sur Linux –