1

私は、とりわけ、ユーザーが日付、電話番号、ID 番号などの項目を含むプロファイルを作成するアプリに取り組んでいます。ユーザーが入力したときにデータがフォーマットされるように設定したいと思います(たとえば、識別番号の適切な場所にダッシュを追加します。ユーザーが正しく入力した場合、すべてがうまくいきますが、元に戻らなければならない場合, いくつか問題があります. 第一に, 追加されたダッシュはバックスペースを押しても削除されません. 第二に, ダッシュの後ろに隠れて数字を修正すると, ダッシュが属していない場所に余分なダッシュが追加されます.

スニペットは次のとおりです。

    from Tkinter import *

    class App:
        def __init__(self, master):
            self.label = Label(text="ID#: ")
            self.entry = Entry()
            self.label.grid(row=0, column=0)
            self.entry.grid(row=0, column=1)
            self.entry.focus_set()
            root.bind('<Key>', self.formatData)
       def formatData(self, master):
            currentData = self.entry.get()
            if len(currentData) == 3:
                self.entry.insert(3, '-')
            elif len(currentData) == 6:
                self.entry.insert(6, '-')
    root = Tk()
    app = App(root)
    root.mainloop()

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

オンザフライでダッシュを挿入して非同期化の問題に悩まされる代わりに、より良い解決策は、常にダッシュのない数字のクリーンなコピーから始めて、後でそれらを追加することです。そうすれば、何度変更しても、常に正しいスペースにダッシュを追加できます。

例:

from Tkinter import *

class App:
    def __init__(self, master):
        self.label = Label(text="ID#: ")

        self.currentData = StringVar()
        self.entry = Entry(textvariable=self.currentData)
        self.positions = [3, 6]

        self.label.grid(row=0, column=0)
        self.entry.grid(row=0, column=1)
        self.entry.focus_set()
        root.bind('<Key>', self.formatData)

    def formatData(self, master):
        # Adding dashes
        raw = [char for char in self.currentData.get() if char != '-']

        for index in self.positions:
            if len(raw) > index:
                raw.insert(index, '-')

        self.currentData.set(''.join(raw))

        # Prevent cursor from derping
        cursor = self.entry.index(INSERT)   # Gets the current cursor position

        for index in self.positions:
            if cursor == (index + 1):                
                # Increment the cursor if it falls on a dash
                cursor += 1

        if master.keysym not in ['BackSpace', 'Right', 'Left', 'Up', 'Down']:
            self.entry.icursor(cursor)

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

いくつかの追加メモ:

  • このバージョンでは StringVar() を使用しているため、単に挿入するだけではなく、エントリの内容を取得して設定することができます。
  • ダッシュの位置をハードコーディングする代わりに、それらを独自のリストに抽象化して、エラーが発生しにくいようにしました。
  • カーソル位置がダッシュと同期しなくなるのを防ぐコードを追加しました。カーソル ロジックは、ダッシュを追加するロジックから完全に独立していることに注意してください。技術的にはそれらを同じループに結合することもできますがfor、デモンストレーションのためにそれらを分離しました。
  • また、バックスペースまたは矢印キーが押された場合にカーソルが自動的に末尾にジャンプするのを防ぐために、追加のコードを追加しました。フィルタリングするキーの 1 つとして「Enter」を追加することも検討してください。
于 2013-09-18T07:43:02.113 に答える