2

キーイベントを他の文字にマッピングする方法はありますか? これは、暗号を入力フィールドに入れる便利な方法です。

例: 私のラップトップには、キーボードに暗号化用の余分なキーはありませんが、数字入力をしなければならないことがよくありました。だから私は、暗号化された文字を変更するエントリがあればいいと思いました:

e -> 1
z -> 2
d -> 3
v -> 4
f -> 5
...

私は多くのことを試しました:

  • ラベルはエントリをシミュレートしますが、このイベントはラベル ウィジェットでサポートされていないため、イベントに問題があります。
  • エントリ<Key>イベントによって、エントリの入力を変更できませんでした。押された Aeは常にエントリに表示されます。(私はtkinterによって伝播された検証方法を使用しました!)。
4

3 に答える 3

1

へのバインドの試みが<Key>失敗した理由は、おそらくキーストロークの処理後に失敗したためですreturn "break"

キーボードの任意のキーに対して独自のバインドを作成できます。たとえば、「e」を変更してやりたいことを行うには、self.entry.bind("<e>", ...). 次に、バインディングに必要なものを挿入できます。を行うreturn "break"と、キーのデフォルトの処理が抑制されます。

辞書にマッピングを設定したい場合は、 にバインドできます"<Key>"。簡単な例を次に示します。

import Tkinter as tk

class Example(tk.Frame):
    map = {"e": "1",
           "z": "2",
           "v": "3",
           # ... and so on
           }

    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.entry = tk.Entry(self, width=20)
        self.entry.pack(side="top", fill="x")
        self.entry.bind("<Key>", self.keymap)

    def keymap(self, event):
        if event.char in self.map:
            self.entry.insert("insert", self.map[event.char])
            return "break"

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
于 2013-06-02T13:33:20.877 に答える
0

私が知っている最も簡単な方法は、エントリ ウィジェットに割り当てた文字列変数を使用して入力をインターセプトすることです。このような変数を使用してできることの 1 つは、その変数が変更されるたびに関数またはメソッドを実行することであり、その関数/メソッドを使用してエントリの内容を変更できます。簡単な例を次に示します。

from Tkinter import *

class EntryHack(Frame):
    def __init__(self, root):
        self.root = root
        Frame.__init__(self, root)
        self.pack(side="left")
        self.entry = Entry(self, width=10)
        self.entry.pack(side="left")
        self.entry_var = StringVar()
        self.entry_var.trace_variable("w", self.changed)
        self.entry["textvariable"] = self.entry_var

    def changed(self, *args):
        """Intercept changes"""
        value = self.entry_var.get()
        changed = False
        frm = "zxcasdqwe"
        to = "123456789"
        if not value.isdigit():
            changed = True
            new = ""
            for char in value:
                if char.isdigit() or char not in frm:
                    new += char
                else:
                    new += to[frm.index(char)]
            value = new
        if changed:
            self.entry_var.set(value)

root = Tk()
app = EntryHack(root)
root.mainloop()

割り当ての良い点は、フィールドに何かを入力すると、trace_variable指定した関数/メソッドが呼び出されます、変数を手動で変更すると呼び出されないため、無限ループを回避できることです。

于 2013-06-02T13:01:08.210 に答える