【问题标题】:How can I avoid keyboard conflict in python Tkinter?如何避免 python Tkinter 中的键盘冲突?
【发布时间】:2016-04-10 15:25:34
【问题描述】:

我想用Tkinter做一个键盘快速操作命令。键盘事件会调用一个函数:当我按下'b'时,执行函数'buy',当我按下's'时,执行函数'sell'。但是我的GUI中有一个条目。当我在这个条目中输入一个数字时,我会按'b'调用函数'buy'或按's'调用函数'sell'。当然该条目会显示@ 987654332@或's'。我想在按's''b'时调用函数,输入将只是区分和显示数字。我怎样才能达到这个目的? 这是我的代码:

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

class TradeSystem(object):
    """docstring for TradeSystem"""

    def __init__(self):
        self.root = Tk()
        self.root.geometry('465x180')
        self.root.resizable(width=True, height=False)

        Label(self.root, text = 'Volume',font = tkFont.Font(size=15, weight='bold')).grid(row=0, column=0)

        self.e1_str = StringVar()
        self.e1 = Entry(self.root,bg = '#D2E48C',width = 10,textvariable = self.e1_str)
        self.e1.grid(row = 1, column = 0)
        
        self.v = IntVar()
        self.Cb = Checkbutton(self.root,variable = self.v,text = 'Keyboard active',onvalue = 1,offvalue  = 0,command = self.Keyeve)
        self.Cb.grid(row = 3,column = 0)

        self.currenttime = StringVar()
        Label(self.root,textvariable = self.currenttime).grid(row=4, column=0,sticky = NW)

        self.t_loop()
        self.root.mainloop()
   
    def buy(self,event):
        print 'This is buy function.'

    def sell(self,event):
        print 'This is sell function.'

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

    def Keyeve(self):
        if self.v.get():
            self.rb()
        else:
            self.root.unbind('<KeyPress-b>')
            self.root.unbind('<KeyPress-s>')

    def t_loop(self):
        self.currenttime.set(datetime.datetime.now().strftime("%Y-%m-%d,%H:%M:%S"))
        self.root.after(1000,self.t_loop)

if __name__ == '__main__':
    TradeSystem()

我在条目self.e1中输入了一些数字,当keyboard active'on'时,我按'b'调用函数'buy',比如:

功能'buy' 起作用了。

我只想输入区分数字,当我完成输入数字后按'b'时,立即调用“购买”功能。我该如何实现?

【问题讨论】:

  • 我建议使用修饰符,例如 Ctrl-B 而不是 B。
  • 成功了。我正在做一个快速订购系统,所以我想尽可能只使用一个键。
  • 如果您真的不习惯使用Ctrl-B,那么您必须将函数绑定到Entry 中的&lt;Key&gt; 事件,以检查输入中按下的所有键。
  • 是的,当我输入'b'时,我只是删除它?我考虑过。但我想这不是一个有效的方法......

标签: python tkinter keyboard


【解决方案1】:

使用修饰键将文本输入与命令热键分开,例如 Ctrl:

self.root.bind('<Control-b>',self.buy)
self.root.bind('<Control-s>',self.sell)
self.root.bind('<Control-B>',self.buy)
self.root.bind('<Control-S>',self.sell)

请注意,上面已经绑定了大写和小写键,因此如果 Caps Lock 开启,它仍然有效。

【讨论】:

  • 谢谢。有什么办法只绑定一个键吗?
  • 好吧,bB 是不同的键,所以如果你希望两者工作相同,请绑定两者。如果您想要 Ctrl-Shift-(按钮)的特殊行为,只需将其绑定到“大写”按钮(如 `"" 用于 Ctrl-Shift-backtick)。
  • 我的意思是只绑定一个键,比如 b 或 B ,而不是 ''。
  • @PengHe - 如果您想验证输入以便文本条目只接受数字并且某些不接受的键(如 b、B、s 或 S)运行函数,请参阅 @ 987654321@。使用修饰键更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2011-07-02
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多