Wxpython: Расположение меню под кнопкой на панели инструментов

У меня были лучшие и самые последовательные результаты через все браузеры установкой Pragma: без кэшей

5
задан 23 July 2009 в 18:30
поделиться

1 ответ

Прочтите раздел о методе 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()

Части этого кода взяты из здесь .

6
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: