如何在Tkinter中退出键盘事件?

时间:2016-01-06 06:12:12

标签: python tkinter keyboard

我想制作键盘快速操作命令。当我按'b'时,打印'b';当我按's'时,打印's'。这是我的代码:

# -*- coding: utf-8 -*-
from Tkinter import *
import tkFont

root = Tk()

def pri(event):
    print event.char

def rb():
    root.bind('<KeyPress-b>',pri)
    root.bind('<KeyPress-s>',pri)

v = IntVar()
def callbackcheck():
    if v.get():
        rb()
Cb = Checkbutton(root,variable = v,text = 'Hello',onvalue = 1,offvalue  = 0,command = callbackcheck)
Cb.pack()

root.mainloop()

当我将Checkbutton设置为'on'时,键盘事件被激活。但是当我设置Checkbutton'off'时,键盘事件无法退出,当我按'b'时,仍然打印'b'。实际上,键盘事件一旦激活就会一直运行。我不知道如何退出键盘事件。你有什么想法吗?

接下来是一个类似的问题: 当我在Tkinter中使用条目时,我只想要输入数字,而不是字母,我找到了使用validateCommand的方法。但是当我点击当前窗口中的其他区域或输入字母时,我无法退出条目小部件。当我点击其他小部件或输入字母时,我想退出条目小部件,我该如何实现这个目标?

2 个答案:

答案 0 :(得分:2)

EDITED

正如Zetys指出的那样,你必须取消绑定键命令组合。根据您的代码:

# -*- coding: utf-8 -*-
from Tkinter import *
import tkFont

root = Tk()

def pri(event):
    print (event.char)

def rb():
    if v.get():
        root.bind('<KeyPress-b>',pri)
        root.bind('<KeyPress-s>',pri)
    else:
        root.unbind('<KeyPress-b>')
        root.unbind('<KeyPress-s>')

v = BooleanVar()

Cb = Checkbutton(root,variable = v,text = 'Hello', command = rb)
Cb.pack()

root.mainloop()

我改变了一些事情:

  • 我删除了callbackcheck(rb现在就行了)
  • 我将IntVar更改为BooleanVar,因此它为'True'或'False'(无需显式调用onvalue和offvalue)。

答案 1 :(得分:1)

当您将Checkbutton设置为“off”时,您应该使用if v.get(): rb() else: root.unbind('<KeyPress-b>') root.unbind('<KeyPress-s>') 删除绑定。

insert into query (date_time, userid, user_traits, query_sql, status, description, is_scheduled_row) 
VALUES ("2016-01-06 02:39:01","307","0,3598,1937,13891,37746,22082,2596,2431,12850,3917,1234784,44712,14638,14418,12850,2631,25003,11428,27450,2592,23593,11441,2826,36330,32219,32351,20720,13997,2594,2467,15687","Select * from gl_base_schema.item where national_status_cd = 'A'","in queue"," (Scheduled Query #413) Pull all items where National Status Code is 'A'", 1)