wxpython快捷键示例

**在这里插入图片描述**

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(800, 600))
        
        # 创建菜单和工具栏
        self.create_menu()
        self.create_toolbar()
        
        # 状态变量
        self.is_connected = False
        self.is_recording = False
        self.scale_factor = 1.0
        
        # 绑定快捷键
        self.bind_shortcuts()
        
        self.Show()
    
    def create_menu(self):
        menu_bar = wx.MenuBar()
        file_menu = wx.Menu()
        self.connect_item = file_menu.Append(wx.ID_ANY, "连接\tCtrl+L")
        self.disconnect_item = file_menu.Append(wx.ID_ANY, "断开\tCtrl+Shift+L")
        file_menu.AppendSeparator()
        exit_item = file_menu.Append(wx.ID_EXIT, "退出\tCtrl+Q")

        view_menu = wx.Menu()
        self.zoom_in_item = view_menu.Append(wx.ID_ANY, "放大\tCtrl++")
        self.zoom_out_item = view_menu.Append(wx.ID_ANY, "缩小\tCtrl+-")
        self.reset_view_item = view_menu.Append(wx.ID_ANY, "重置视图\tCtrl+0")

        record_menu = wx.Menu()
        self.record_item = record_menu.AppendCheckItem(wx.ID_ANY, "录制\tCtrl+Shift+R")

        menu_bar.Append(file_menu, "文件")
        menu_bar.Append(view_menu, "视图")
        menu_bar.Append(record_menu, "录制")
        self.SetMenuBar(menu_bar)

        # 绑定菜单项事件
        self.Bind(wx.EVT_MENU, self.on_connect, self.connect_item)
        self.Bind(wx.EVT_MENU, self.on_disconnect, self.disconnect_item)
        self.Bind(wx.EVT_MENU, self.on_exit, exit_item)
        self.Bind(wx.EVT_MENU, self.on_zoom_in, self.zoom_in_item)
        self.Bind(wx.EVT_MENU, self.on_zoom_out, self.zoom_out_item)
        self.Bind(wx.EVT_MENU, self.on_reset_view, self.reset_view_item)
        self.Bind(wx.EVT_MENU, self.on_record, self.record_item)

    def create_toolbar(self):
        self.toolbar = self.CreateToolBar()
        def bmp(path):
            return wx.Bitmap(wx.Image(path, wx.BITMAP_TYPE_PNG).Rescale(20, 20))
        self.toolbar.AddTool(wx.ID_ANY, "连接", bmp("connect.png"), "连接")
        self.toolbar.AddTool(wx.ID_ANY, "断开", bmp("disconnect.png"), "断开")
        self.toolbar.AddSeparator()
        self.toolbar.AddTool(wx.ID_ANY, "放大", bmp("zoom_in.png"), "放大")
        self.toolbar.AddTool(wx.ID_ANY, "缩小", bmp("zoom_out.png"), "缩小")
        self.toolbar.AddTool(wx.ID_ANY, "重置视图", bmp("reset.png"), "重置视图")
        self.toolbar.AddSeparator()
        self.record_tool = self.toolbar.AddCheckTool(
            wx.ID_ANY, "录制", bmp("record.png"), wx.NullBitmap, "录制", "开始或停止录制"
        )
        self.toolbar.Realize()

        # 绑定工具栏事件
        self.Bind(wx.EVT_TOOL, self.on_connect, id=self.toolbar.GetToolByPos(0).GetId())
        self.Bind(wx.EVT_TOOL, self.on_disconnect, id=self.toolbar.GetToolByPos(1).GetId())
        self.Bind(wx.EVT_TOOL, self.on_zoom_in, id=self.toolbar.GetToolByPos(3).GetId())
        self.Bind(wx.EVT_TOOL, self.on_zoom_out, id=self.toolbar.GetToolByPos(4).GetId())
        self.Bind(wx.EVT_TOOL, self.on_reset_view, id=self.toolbar.GetToolByPos(5).GetId())
        self.Bind(wx.EVT_TOOL, self.on_record, id=self.record_tool.GetId())
    
    # 你的快捷键不起作用,是因为加速器表里的第三个参数不能用 wx.ID_ANY,必须用你实际菜单项的 ID,否则事件不会被正确分发。
    def bind_shortcuts(self):
        # 创建加速器表
        accel_tbl = wx.AcceleratorTable([
            (wx.ACCEL_CTRL, ord('L'),self.connect_item.GetId()),           # Ctrl+L: 连接
            (wx.ACCEL_CTRL | wx.ACCEL_SHIFT, ord('L'), self.disconnect_item.GetId()),  # Ctrl+Shift+L: 断开
            (wx.ACCEL_CTRL, ord('+'), self.zoom_in_item.GetId()),           # Ctrl++: 放大
            (wx.ACCEL_CTRL, ord('-'), self.zoom_out_item.GetId()),           # Ctrl+-: 缩小
            (wx.ACCEL_CTRL, ord('0'), self.reset_view_item.GetId()),           # Ctrl+0: 重置视图
            (wx.ACCEL_CTRL | wx.ACCEL_SHIFT, ord('R'),self.record_item.GetId()),  # Ctrl+Shift+R: 录制
        ])
        self.SetAcceleratorTable(accel_tbl)
    
    def on_connect(self, event):
        print("1122")
        if not self.is_connected:
            self.is_connected = True
            print("已连接")
            # 更新UI状态
            # self.GetMenuBar().Enable(self.GetMenuBar().FindItem("断开"), True)
            # self.GetMenuBar().Enable(self.GetMenuBar().FindItem("连接"), False)
    
    def on_disconnect(self, event):
        if self.is_connected:
            self.is_connected = False
            print("已断开")
            # 更新UI状态
            # self.GetMenuBar().Enable(self.GetMenuBar().FindItem("连接"), True)
            # self.GetMenuBar().Enable(self.GetMenuBar().FindItem("断开"), False)
    
    def on_zoom_in(self, event):
        self.scale_factor *= 1.1
        print(f"放大: {self.scale_factor:.2f}x")
    
    def on_zoom_out(self, event):
        self.scale_factor *= 0.9
        print(f"缩小: {self.scale_factor:.2f}x")
    
    def on_reset_view(self, event):
        self.scale_factor = 1.0
        print("视图已重置")
    
    def on_record(self, event):
        self.is_recording = not self.is_recording
        status = "开始录制" if self.is_recording else "停止录制"
        print(status)
        # 更新UI状态
        self.record_item.Check(self.is_recording)
        self.GetToolBar().ToggleTool(self.record_tool.GetId(), self.is_recording)
    
    def on_exit(self, event):
        self.Close()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None, "快捷键示例")
    app.MainLoop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloworddm

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值