5

wx.ToolBar に CheckLabelTool があり、マウス クリックでそのすぐ下にメニューがポップアップするようにします。メニューの位置を設定できるようにツールの場所を取得しようとしていますが、試したすべてのもの (GetEventObject、GetPosition など) でツールバーの位置がわかるため、メニューがツールバーの下に表示されます。 、しかし関連するツールからは非常に離れています。助言がありますか?ツールにトグル機能とビットマップ機能を持たせる必要がありますが、他にもっとうまく機能するものがあれば、CheckLabelTool に固定されていません。

ありがとう!

4

1 に答える 1

6

wxpython.orgのPopupMenuメソッドに関するセクションを読んでください。

このウィンドウを基準にして、指定された座標で指定されたメニューをポップアップし、ユーザーがメニューを閉じたときに制御を返します。メニュー項目が選択されている場合、対応するメニュー イベントが生成され、通常どおりに処理されます。デフォルトの場合位置が指定された場合、マウス カーソルの現在の位置が使用されます。」

チェックツールの 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()

このコードの一部はhereから来ています。

于 2009-07-24T00:43:28.593 に答える