Tkinter:在用户输入数据时格式化数据

时间:2013-09-18 06:56:16

标签: python formatting tkinter

我正在开发一个应用程序,其中用户将创建包含日期,电话号码和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()

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分: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”作为过滤的键之一。