wxpython 禁用 TextCtrl 上下文菜单

0 投票
1 回答
2305 浏览
提问于 2025-04-16 06:12

你好。我正在尝试在wxpython的TextCtrl控件中禁用右键菜单,也就是当我右键点击时不想让菜单弹出来。如果我自己创建一个菜单并把它绑定到右键点击事件上,它就会总是显示我自己的菜单。但是如果我不在右键点击事件中创建菜单,它就会自动生成一个标准的右键菜单,即使我没有调用event.Skip()(请看示例代码)。这是个bug吗?有没有办法解决这个标准右键菜单的问题?

    self.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseRightDown)

def OnMouseRightDown(self, event):
    pt = event.GetPosition()
    self.RightClickContext(event, pt, True)

def RightClickContext(self, event, pt, enable):

    menu = wx.Menu()
    undo = menu.Append(ID_UNDO, 'Undo')
    menu.AppendSeparator()
    cut = menu.Append(ID_CUT, 'Cut')
    copy = menu.Append( ID_COPY, 'Copy' )        
    paste = menu.Append( ID_PASTE, 'Paste' )
    menu.AppendSeparator()
    delete = menu.Append( ID_DELETE, 'Delete' )
    selectall = menu.Append( ID_SELECTALL, 'Select All' )
    undo.Enable(False)
    cut.Enable(False)
    copy.Enable(False)
    if enable:
        paste.Enable(True)
    else:
        paste.Enable(False)
    delete.Enable(False)
    selectall.Enable(False)

    wx.EVT_MENU(menu, ID_PASTE,  self.MenuPaste)

    self.PopupMenu(menu, pt)
    menu.Destroy() 

1 个回答

2

试试这个(我用的是Python 2.7):

import wx

class Test(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title='Test', size = (700,500))

        self.screen = wx.TextCtrl(self, wx.ID_ANY, style = wx.TE_MULTILINE)
        self.screen.Bind(wx.EVT_CONTEXT_MENU, self.skip)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.screen, 1, wx.GROW | wx.ALL)
        self.SetSizer(self.sizer)

    def skip(self, evt):
        return

app = wx.App(False)
frame = Test(None)
frame.Show()
app.MainLoop()

光看这些代码很难判断具体情况,但可能是你没有明确地返回结果,或者还有其他事件也在处理,比如evt_right_up。

撰写回答