1

我正在开发一个应用程序,除其他外,用户将创建个人资料,包括日期、电话号码和身份证号码等项目。我想对其进行设置,以便在用户键入数据时对其进行格式化(例如,在标识号的适当位置添加破折号。如果用户正确键入,一切正常,但如果你必须返回,有几个地方出错了。首先,添加的破折号不会随着按退格键而删除。其次,如果您在破折号后面并更正数字,则会在不属于它们的地方添加额外的破折号。

这是片段:

    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循环中,但出于演示目的,我将它们分开。
  • 我还添加了一些额外的代码,以防止在按下退格键或箭头键时光标自动跳到末尾。您可能还需要考虑将“Enter”添加为要过滤的键之一。
于 2013-09-18T07:43:02.113 回答