У меня были лучшие и самые последовательные результаты через все браузеры установкой Pragma: без кэшей
Прочтите раздел о методе PopupMenu на сайте wxpython.org:[12114 impression"Показывает данное меню в указанные координаты относительно это окно и возвращает управление, когда пользователь закрыл меню. Если выбран пункт меню, генерируется соответствующее событие меню и будут обработаны как обычно. Если дается позиция по умолчанию, затем текущая позиция курсора мыши будет использоваться. "
Вам необходимо выполнить привязку к событию EVT_MENU вашего инструмента проверки. После того, как кнопка инструмента отмечена, вы можете вывести всплывающее меню. Если вы не укажете расположение всплывающего окна, оно будет использовать текущее положение мыши, которое вы хотите.
Если вы хотите, чтобы меню отображалось в заранее определенном месте, которое не зависит от мыши, вы можете получить экранное местоположение панели инструментов и добавить смещение
Давайте посмотрим на код:
[ Редактировать : чтобы показать, как вычислить положение любой точки на инструменте, я изменил код, чтобы вычислять и отображать различные точки на панели инструментов при нажатии на инструмент. Меню появляется в правом нижнем углу нажатой кнопки. У меня работает в Windows. Мне любопытно узнать, не работает ли он на других платформах.]
import wx
class ViewApp(wx.App):
def OnInit(self):
self.frame = ToolFrame(None, -1, "Test App")
self.frame.Show(True)
return True
class MyPopupMenu(wx.Menu):
def __init__(self, parent):
wx.Menu.__init__(self)
self.parent = parent
minimize = wx.MenuItem(self, wx.NewId(), 'Minimize')
self.AppendItem(minimize)
self.Bind(wx.EVT_MENU, self.OnMinimize, id=minimize.GetId())
def OnMinimize(self, event):
self.parent.Iconize()
class ToolFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(350, 250))
self.toolbar = self.CreateToolBar()
self.tool_id = wx.NewId()
for i in range(3):
tool_id = wx.NewId()
self.toolbar.AddCheckLabelTool(tool_id, 'Tool', wx.EmptyBitmap(10,10))
self.toolbar.Bind(wx.EVT_MENU, self.OnTool, id=tool_id)
self.toolbar.Realize()
self.Centre()
self.Show()
def OnTool(self, event):
if event.IsChecked():
# Get the position of the toolbar relative to
# the frame. This will be the upper left corner of the first tool
bar_pos = self.toolbar.GetScreenPosition()-self.GetScreenPosition()
# This is the position of the tool along the tool bar (1st, 2nd, 3rd, etc...)
tool_index = self.toolbar.GetToolPos(event.GetId())
# Get the size of the tool
tool_size = self.toolbar.GetToolSize()
# This is the upper left corner of the clicked tool
upper_left_pos = (bar_pos[0]+tool_size[0]*tool_index, bar_pos[1])
# Menu position will be in the lower right corner
lower_right_pos = (bar_pos[0]+tool_size[0]*(tool_index+1), bar_pos[1]+tool_size[1])
# Show upper left corner of first tool in black
dc = wx.WindowDC(self)
dc.SetPen(wx.Pen("BLACK", 4))
dc.DrawCircle(bar_pos[0], bar_pos[1], 4)
# Show upper left corner of this tool in blue
dc.SetPen(wx.Pen("BLUE", 4))
dc.DrawCircle(upper_left_pos[0], upper_left_pos[1], 4)
# Show lower right corner of this tool in green
dc.SetPen(wx.Pen("GREEN", 4))
dc.DrawCircle(lower_right_pos[0], lower_right_pos[1], 4)
# Correct for the position of the tool bar
menu_pos = (lower_right_pos[0]-bar_pos[0],lower_right_pos[1]-bar_pos[1])
# Pop up the menu
self.PopupMenu(MyPopupMenu(self), menu_pos)
if __name__ == "__main__":
app = ViewApp(0)
app.MainLoop()
Части этого кода взяты из здесь .