Python tkinter条目小部件,在固定位置保留一个点

Python tkinter条目小部件,在固定位置保留一个点,tkinter,Tkinter,我制作了一个GUI,其中有四个输入字段,我必须将键盘符号点(.)固定在光标位置3、7和11处。因此,每当用户输入任何值符号点(.)无论输入值是多少,都必须在其固定位置上。但在我的例子中,我在起始三个位置上得到了一个点符号,并且该点符号正在改变其位置,因此任何人都可以在我下面给出的代码中帮助我解决这个问题 from tkinter import * root = Tk() e1=Entry(root, width=15, background='white',

我制作了一个GUI,其中有四个输入字段,我必须将键盘符号点(.)固定在光标位置3、7和11处。因此,每当用户输入任何值符号点(.)无论输入值是多少,都必须在其固定位置上。但在我的例子中,我在起始三个位置上得到了一个点符号,并且该点符号正在改变其位置,因此任何人都可以在我下面给出的代码中帮助我解决这个问题

from tkinter import *
root = Tk()
e1=Entry(root, width=15, background='white',
                                   font='-weight bold')
e2= Entry(root, width=15, background='white',
                            font='-weight bold')
e3= Entry(root, width=15, background='white',
                                font='-weight bold')
e4= Entry(root, width=15, background='white',
                                   font='-weight bold')

e1.grid(padx=10, pady=5, row=0, column=1)
e2.grid(padx=10, pady=5, row=1, column=1)
e3.grid(padx=10, pady=5, row=2, column=1)
e4.grid(padx=10, pady=5, row=3, column=1)

entries=[e1,e2,e3,e4]

for widget in entries:
    for i in range(3,12,4):
        widget.insert(i,'.')

root.mainloop()

我认为最简单的解决方案是创建一个自定义小部件,它由四个长度为3的
条目
小部件组成,再加上三个用于点的
标签
小部件,所有这些小部件都位于一个
框架内,用于提供边框

例如:

class IPEntry(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, borderwidth=1, relief="sunken",
                          background="white")
        self.entries = []
        for i in range(4):
            entry = tk.Entry(self, width=3, borderwidth=0,
                             justify="center",
                             highlightthickness=0, background="white")
            entry.pack(side="left")
            self.entries.append(entry)

            if i < 3:
                dot = tk.Label(self, text=".", background="white")
                dot.pack(side="left")

    def get(self):
        return ".".join([entry.get() for entry in self.entries])
上面将创建一个如下所示的窗口:

要获取字符串形式的值,请调用
get
方法:

print("the field value is: {}".format(field.get()))

为了提供更愉快的用户体验,您可能应该添加输入验证,以仅允许数字,并允许每个条目最多三个小部件。您还可以添加代码,在用户在字段中输入三位数字后将光标移动到下一个字段,如果用户在输入字段的开头单击backspace,则将光标移动到上一个字段

如果在位置3、7和11处需要它们,如果用户删除了所有内容,或者删除了最后几个字符,因此只有9个字符,您该怎么办?例如,如果用户输入“123”,您希望在小部件中看到什么?我希望看到这样的内容:255.123.255.125,因此默认情况下,我必须将点保持在固定位置,因此我必须将点始终保持在输入字段上。仍然很难理解您想要什么。您有四个宽度为10的入口小部件。10的宽度不足以显示四组三位数字,但如果只需要三位数字,那么它就太宽了。你是希望每个条目小部件都包含xxx.xxx.xxx.xxx,还是每个小部件只有三位数字,并且希望每个条目小部件之间出现一个点?哦,是的,输入字段的“我的错误”宽度是15个字符。因此,现在我希望所有四个条目字段都像这个xxx.xxx.xxx.xxx,在每个3个字符的末尾都应该有点(.)在所有四个条目的小部件中。见上文,我上传了一张图片,显示了我想要实现的内容@Bryan OakleyI尝试了上述自定义小部件,但即使每个输入字段的宽度为3,每个输入字段也需要超过3个字符。@ARYA1992:是的,您需要添加一些输入验证以仅允许数字,并且最多只允许三个。请参阅已被接受的答案
print("the field value is: {}".format(field.get()))