pyqt5实现用户不修改代码完成修改键盘快捷键响应事件

文章概述
pyqt5实现用户不修改代码完成修改键盘快捷键响应事件

问题背景
在pyqt5的键盘事件中,允许用户自定义快捷键:
比如:event.key() == Qt.Key_F1
此时设置的快捷键为F1
相关代码可写为:

if event.key() == Qt.Key_F1:
		print(“Hello”)

这样就定义了一个键盘快捷键事件

遇到的问题:
想要用户可以在使用pyqt5打包的程序用可以不用修改程序并方便的修改快捷键,比如将快捷键【F1】改为键盘按键【A】

尝试的办法
尝试一:增加Qdialog弹窗,增加getText组件,获取用户输入的字符串
尝试二:在代码目录下新增一个txt文件夹,里面的内容为一个字母,比如想要将快捷键设置为【A】,则在文本文件中写a,然后读取文件内容

这两种方法遇到的问题都是因为python将获取的内容的类型默认为字符串
用下面代码测试

if (event.key() == Qt.Key_F1):
    print(type(event.key()))
    print(type(Qt.Key_F1))

下面为输出结果:

<class 'int'>
<class 'PyQt5.QtCore.Qt.Key'>

可见我们无法简单的从弹窗或者文本文件中获取Qt.Key_F1来相应事件,

然后尝试用PyQt5.QtCore.Qt.Key()进行尝试转换,显然这个办法是不成立的

问题的解决:
想到计算机内部都是用编码来进行处理问题的。即使输入的是字符,最终也要转换为编码才行(想到最近网上看到的一个视频,说是用自己QQ的十六位进制的号码也能登录上去),于是我查找了一下计算机键盘对应的编码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
容易找到键盘按键【A】对应的十六进制编码为0x41,十进制编码为65.
然后我们将之前的代码event.key() == Qt.Key_A 改为 event.key() == 0x41,发现程序可以正常进行,接着尝试转化为十进制,即event.key() == Qt.Key_A 改为 event.key() == 65,仍然成立

这样我们可以让用户输入数字即可。
但是仍需要注意的是用户输入的仍然是字符串,需要在转化为int类型。为了方便,不妨采用十进制

但是进一步想,我们需要为用户方便。所以让用户还是输入字母,我们进行转换一下就行了

下面是我的示例demo,会给出注释

代码示例:
首先建立一个文本文件 按键1.txt
内容为 a
然后就是py文件

        #demo.py
        #@Kingdeguo All rights reserved
        
        press1 = open('按键1.txt')  #打开文本文件
        press1_number = press1.read()  #获取文本文件内容

		#将用户输入转化为十进制编码
        if press1_number == 'a':
            press1_number = 65
        if press1_number == 'b':
            press1_number = 66
        if press1_number == 'c':
            press1_number = 67
        if press1_number == 'd':
            press1_number = 68
        if press1_number == 'e':
            press1_number = 69
        if press1_number == 'f':
            press1_number = 70
        if press1_number == 'g':
            press1_number = 71
        if press1_number == 'h':
            press1_number = 72
        if press1_number == 'i':
            press1_number = 73
        if press1_number == 'i':
            press1_number = 73
        if press1_number == 'j':
            press1_number = 74
        if press1_number == 'K':
            press1_number = 75
        if press1_number == 'l':
            press1_number = 76
        if press1_number == 'm':
            press1_number = 77
        if press1_number == 'n':
            press1_number = 78
        if press1_number == 'o':
            press1_number = 79
        if press1_number == 'p':
            press1_number = 80
        if press1_number == 'q':
            press1_number = 81
        if press1_number == 'r':
            press1_number = 82
        if press1_number == 's':
            press1_number = 83
        if press1_number == 't':
            press1_number = 84
        if press1_number == 'u':
            press1_number = 85
        if press1_number == 'v':
            press1_number = 86
        if press1_number == 'w':
            press1_number = 87
        if press1_number == 'x':
            press1_number = 88
        if press1_number == 'y':
            press1_number = 89
        if press1_number == 'z':
            press1_number = 90

		#进行事件处理
		if (event.key() == int(press1_number)):
			print("Hello")

当我们需要多个快捷键时,不妨在建立一个文本文件按键1.txt
内容为 b

#在上文的基础上加上下面代码
		press2 = open('按键2.txt')
        press2_number = press2.read()
        if press2_number == 'a':
            press2_number = 65
        if press2_number == 'b':
            press2_number = 66
        if press2_number == 'c':
            press2_number = 67
        if press2_number == 'd':
            press2_number = 68
        if press2_number == 'e':
            press2_number = 69
        if press2_number == 'f':
            press2_number = 70
        if press2_number == 'g':
            press2_number = 71
        if press2_number == 'h':
            press2_number = 72
        if press2_number == 'i':
            press2_number = 73
        if press2_number == 'i':
            press2_number = 73
        if press2_number == 'j':
            press2_number = 74
        if press2_number == 'K':
            press2_number = 75
        if press2_number == 'l':
            press2_number = 76
        if press2_number == 'm':
            press2_number = 77
        if press2_number == 'n':
            press2_number = 78
        if press2_number == 'o':
            press2_number = 79
        if press2_number == 'p':
            press2_number = 80
        if press2_number == 'q':
            press2_number = 81
        if press2_number == 'r':
            press2_number = 82
        if press2_number == 's':
            press2_number = 83
        if press2_number == 't':
            press2_number = 84
        if press2_number == 'u':
            press2_number = 85
        if press2_number == 'v':
            press2_number = 86
        if press2_number == 'w':
            press2_number = 87
        if press2_number == 'x':
            press2_number = 88
        if press2_number == 'y':
            press2_number = 89
        if press2_number == 'z':
            press2_number = 90

然后
响应事件写为:

if (event.key() == int(press1_number)):
	print("Hello")
if (event.key() == int(press2_number)):
    print("World")

对比
1:方便用户修改。比如用弹窗修改的话效果会随着程序的关闭而失效,而保存在文件中则不会
2:方便管理对应的相应事件。因为这样可以一个文件中的内容对应一个相应的事件,就像函数的映射。如果用弹窗则可能会出现修改完快捷键后把对应的事件也修改
3:方便后期维护。后期进行功能的增加或者修改或者减少时都可以很容的进行管理

欢迎提供更好的解决思路~

————————————————————————————————
更新:
刚知道有字典排序这个东西。。。
平时用Python比较少,没想到这个这么方便
新的代码如下

        Press={"a":65, "b":66, "c":67, "d":68, "e":69,
               "f":70, "g":71, "h":72, "i":73, "j":74,
               "k":75, "l":76, "m":77, "n":78, "o":79,  
               "p":80, "q":81, "r":82, "s":83, "t":84,
               "u":85, "v":86, "w":87, "x":88, "y":89,
               "z":90,
               "0":48, "1":49, "2":50, "3":51, "4":52,
               "5":53, "6":54, "7":55, "8":56, "9":57,
               "F1":16777264, "F2":16777265, "F3":16777266, "F4":1677726"F5":16777268,"F6":16777269, "F7":16777270, "F8":16777271, 
               "F9":16777272}

        press1 = open('按键1.txt')
        press2 = open('按键2.txt')

		press1_number = Press[press1.read()]
        press2_number = Press[press2.read()]


        if (event.key() == press1_number):
       		print("Hello")
	    if (event.key() == press2_number):
		    print("World")

发布了22 篇原创文章 · 获赞 39 · 访问量 4021

猜你喜欢

转载自blog.csdn.net/weixin_44895666/article/details/103948615