Tkinter:当用户键入i时格式化数据

2024-04-24 07:42:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个应用程序,在这个应用程序中,用户将创建包括日期、电话号码和身份证号码等项目的个人资料。我想对其进行设置,以便在用户键入数据时对数据进行格式化(例如,在标识号的适当位置添加破折号)。如果用户输入正确,一切正常,但如果必须返回,则会出现一些问题。首先,添加的破折号不会随着空格键的按下而删除。第二,如果你在破折号后面纠正了数字,多余的破折号会被添加到它们不属于的地方。你知道吗

以下是片段:

    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()

任何帮助都将不胜感激。谢谢。你知道吗


Tags: 数据用户selfmasterapp应用程序defcolumn
1条回答
网友
1楼 · 发布于 2024-04-24 07:42:55

一个更好的解决方案不是在运行中插入破折号,而是始终从数字的干净副本开始,没有任何破折号,然后再添加它们。这样,无论进行了多少次修改,都将始终在正确的空格中添加破折号。你知道吗

举个例子:

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循环中,但为了演示的目的,我将它们分开。你知道吗
  • 我还添加了一些额外的代码,以防止在按backspace或箭头键时光标自动跳到末尾。您还可以考虑添加“Enter”作为要筛选的键之一。你知道吗

相关问题 更多 >