如何创建一行单字符文本框并让光标随着用户输入自动前进?

问题描述 投票:0回答:1

我正在制作一款供我个人使用的移动汽车维修应用程序。在我的客户信息部分,我有一个用于输入车辆信息的窗格。在该车辆信息中,我想包含车辆的十七位 VIN。

在我的标签显示(应用程序的不同区域)中,我希望解析 17 位 VIN,以便我可以快速识别第八个字符和最后八个字符。第八位是发动机代码。最后八个是经销商在查找零件时使用的。

在我看来,连接十七个单独的字符并在我想要的位置添加空格比采用十七位数字字符串并解析它更简单。

所以,我决定十七个单独的输入框是正确的方法。 但是,必须在每个字符后按 Tab 键才能到达下一个框,这很乏味。因此,我希望拥有它,以便一旦我在第一个框中输入一个字符,它就会自动前进到第二个框中。一旦我在第二个字符中输入一个字符,它就会自动前进到第三个字符。等等。这样我就可以输入 VIN。

我在制作盒子或让它们发挥作用方面没有任何问题。但我对 Python 还不够了解,不知道需要创建什么样的事件函数才能达到我想要的效果。

我是新手。如果你明白我的意思,请尽你所能,给我预代数,而不是微积分。

我尝试过的工作是这样的:

def advnum1(event):
    entry = event.widget
    if len(entry.get()) == entry.get_max_length():
        next_widget = entry.tkinter_focusNext()
        if next_widget:
            next_widget.focus()

fnumbox1 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=4)
fnumbox1.place(x=112, y=181.5)
fnumbox1.bind("<KeyRelease>", advnum1)
fnumbox2 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=4)
fnumbox2.place(x=144, y=181.5)
fnumbox3 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=5)
fnumbox3.place(x=176, y=181.5)

但是尽管我尝试更改表达式的不同部分,但一切都会给我一个错误。 get 函数似乎不喜欢这种安排。其他的都说没有属性。我尝试输入条目控件的变量名称。我尝试过各种各样的事情。似乎什么都不起作用。我假设这只是一个大纲脚本。但我不确定实际上应该是什么,以及应该用特定变量或小部件名称替换什么。

python tkinter
1个回答
0
投票

好吧,我明白了。

def my_variable(event):
    VINbox1.focus()

这与:

VINbox1 = tkinter.Entry(master=root, bg="#b2b4b7", fg="#000000", width=1, relief=tkinter.FLAT)
VINbox1.bind("<KeyRelease>", my_variable)

无需进行“if”或“len”测试或比较来将焦点转移到单个字母或数字。不过,必须编写十七个单独的事件才能按照我的要求进行操作。

我发现适用于多个数字(如电话号码)的类似版本是:

def advnum1(event):
    phtext1 = fnumbox1.get()
    phlen1 = len(phtext1)
    if phlen1 == 3:
        fnumbox2.focus()
def advnum2(event):
    phtext2 = fnumbox2.get()
    phlen2 = len(phtext2)
    if phlen2 == 3:
        fnumbox3.focus()
def advnum3(event):
    phtext3 = fnumbox3.get()
    phlen3 = len(phtext3)
    if phlen3 == 4:
        altfnumbox1.focus()

这与以下组合:

fnumbox1 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=4)
fnumbox1.place(x=112, y=181.5)
fnumbox1.bind("<KeyRelease>", advnum1)
fnumbox2 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=4)
fnumbox2.place(x=144, y=181.5)
fnumbox2.bind("<KeyRelease>", advnum2)
fnumbox3 = tkinter.Entry(master=cstinfofrmfg, justify="center", bg="#b2b4b7", fg="#000000", width=5)
fnumbox3.place(x=176, y=181.5)
fnumbox3.bind("<KeyRelease>", advnum3)

我总是乐于学习新的做事方式。欢迎任何有关更简单代码的建议。

© www.soinside.com 2019 - 2024. All rights reserved.