2012-01-29 10 views
1

Tkinter TextウィジェットでKeyReleaseイベントを使用しようとすると、event.charに小文字が表示されることがありますが、テキストウィジェットには大文字が表示されます。これは私が軽くすばやくシフトボタンを押してから文字を押すと発生します。 Tkinter TextウィジェットのKeyReleaseイベントを使って、正確に入力された文字を確実に取得するにはどうすればよいですか?Tkinter KeyRelease Eventを作成するには、一貫して大文字を使用しますか?

from Tkinter import * 

class App: 

    def __init__(self): 

     # create application window 
     self.root = Tk() 

     # add frame to contain widgets 
     frame = Frame(self.root, width=768, height=576, 
         padx=20, pady=20, bg="lightgrey") 
     frame.pack() 

     # add text widget to contain text typed by the user 
     self.text = Text(frame, name="typedText", bd="5", wrap=WORD, relief=FLAT) 
     self.text.bind("<KeyRelease>", self.printKey) 
     self.text.pack(fill=X) 

    """ 
    printKey sometimes prints lowercase letters to the console, 
    but upper case letters in the text widget, 
    especially when I lightly and quickly press Shift and then some letter 
    on my MacBook Pro keyboard 
    """ 
    def printKey(self, event): 
     print event.char 

    def start(self): 
     self.root.mainloop() 

def main(): 
    a = App() 
    a.start() 

if __name__ == "__main__": 
    sys.exit(main()) 

答えて

3

何が起こっていることは、あなたが文字キーの前にシフトキーをリリースしていることである。

は、ここで私は私のMacBook Proの上でテストされたサンプルコードです。文字が挿入された時点でシフトが押されているため、ウィジェットが大文字になるのですが、keyreleaseバインディングが処理されるまでにシフトはすでに解除されているので、小文字が表示されます。

挿入されているものを印刷する場合は、リリースではなくキープレスにバインドします。

0

ブライアンの洞察に基づいて、私は、コードを修正し、動作するように表示されます。

from Tkinter import * 
import string 

class App: 

    def __init__(self): 

    # create application window 
    self.root = Tk() 

    # add frame to contain widgets 
    frame = Frame(self.root, width=768, height=576, padx=20, pady=20, bg="lightgrey") 
    frame.pack() 

    # add text widget to contain text typed by the user 
    self.text = Text(frame, name="typedText", bd="5", wrap=WORD, relief=FLAT) 
    self.text.bind("<KeyPress>", self.printKey) 
    self.text.pack(fill=X) 

    """ 

    this correctly prints the letters when pressed (and does not print the Shift keys) 

    """ 
    def printKey(self, event): 
    # Adapted from http://www.kosbie.net/cmu/fall-10/15-110/koz/misc-demos/src/keyEventsDemo.py 
    ignoreSyms = [ "Shift_L", "Shift_R", "Control_L", "Control_R", "Caps_Lock" ]  
    if event.keysym not in ignoreSyms: 
     print event.char 

    def start(self): 
    self.root.mainloop() 

def main(): 
    a = App() 
    a.start() 

if __name__ == "__main__": 
    sys.exit(main()) 
関連する問題