文章概述
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")