2016-01-06 49 views
1

我想用Tkinter做一個鍵盤快捷操作命令。鍵盤事件會調用一個函數:當我按'b',執行功能'buy',當我按's'時,執行功能'sell'。但是在我的GUI中有一個條目。當我在此條目中輸入一個數字時,我將按'b'調用功能'buy'或按's'調用功能'sell'。當然,條目將顯示'b''s'。我想在調用's''b'時調用功能,該條目將只是區分和顯示數字。我可以如何達到這個目的? 這裏是我的代碼:如何避免python Tkinter中的鍵盤衝突?

# -*- 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',如:

enter image description here

和溫控功能'buy'工作。

enter image description here

我只是想進入區分數字和當我按下'b'後,我完成輸入號碼功能的「買入」被調用immediately.How我能做到這一點?

+1

我建議使用修飾符,如Ctrl-B,而不是隻是B. – TigerhawkT3

+0

這是工作。我正在做一個快速訂單系統,所以我想盡可能只使用一個鍵。 –

+0

如果你真的不想使用'Ctrl-B',那麼你必須綁定函數到'Entry'中的''事件來檢查在條目中按下的所有按鍵。 – furas

回答

0

獨立的命令熱鍵使用組合鍵文本輸入,就像按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) 

注意上面已經結合大寫和小寫字母鍵,以便它仍然有效,如果帽鎖處於打開狀態。

+0

Thx。有什麼辦法可以綁定一個鍵嗎? –

+0

那麼,'b'和'B'是不同的鍵,所以如果你想同時工作,綁定兩個。如果你需要Ctrl-Shift-(按鈕)的特殊行爲,只需將其綁定到「大寫」按鈕(如Ctrl-Shift-backtick的「」)。 – TigerhawkT3

+0

我的意思是隻綁定一個鍵,如b或B,而不是''。 –