Tkinter:entry.configure(state="normal") 在我的程序中不起作用

Tkinter: entry.configure(state="normal") not workinfg in my program

我是初学者,我正在尝试在 python 中制作一个 Wordle 游戏来练习。

每个字符都在不同的条目中,所以我只启用了重点条目,禁用了其他四个条目。 我创建了一个“退格”按钮来删除用户输入的最后一个字符。此按钮应该启用用户要删除的字符的条目,然后删除字符,然后聚焦此条目,最后禁用先前聚焦的条目。

问题是,每当我想使用退格键时,它都不会启用该条目,它只会删除其内容并禁用删除字符后的条目。

Video of the problem

代码如下:

from tkinter import *
from tkinter import ttk
import tkinter as tk
def callback1(var, index, mode):
    root.box2.configure(state="normal")
    root.box2.focus()
    root.box1.configure(state="disabled")
    root.hasfocus = "box2"

def callback2(var, index, mode):
    root.box3.configure(state="normal")
    root.box3.focus()
    root.box2.configure(state="disabled")
    root.hasfocus = "box3"

def callback3(var, index, mode):
    root.box4.configure(state="normal")
    root.box4.focus()
    root.box3.configure(state="disabled")
    root.hasfocus = "box4"

def callback4(var, index, mode):
    root.box5.configure(state="normal")
    root.box5.focus()
    root.box4.configure(state="disabled")
    root.hasfocus = "box5"
    
class root(Tk):
    def __init__(self):
        super(root, self).__init__()
        
        self.title("Wordle")
        self.minsize(530,400)
        self.configure(bg='#121213')

        self.hasfocus = ""

        self.createBoxes()
        self.createEntry()
        self.button = Button(self, text="Backspace", width=8, font ="Calibri 18", command=self.backspace)
        self.button.place(x=420, y=31)

    def createBoxes(self):
        b=0 ; d=0
        while b<6:
            a=0 ; c=0
            while a<5:
                tk.Label(height=2, width=5, bg="white").place(x=115+c, y=30+d)
                a=a+1
                c=c+60
            d=d+50 ; b=b+1

    def backspace(self):
        if self.hasfocus == "box1":
            pass
        elif self.hasfocus == "box2":
            self.box1.configure(state="normal")
            self.box1.delete(0, 'end')
            self.box1.focus()
            self.hasfocus="box1"
            self.box2.configure(state="disabled")
        elif self.hasfocus == "box3":
            self.box2.configure(state="normal")
            self.box2.delete(0, 'end')
            self.box2.focus()
            self.hasfocus="box2"
            self.box3.configure(state="disabled")
        elif self.hasfocus == "box4":
            self.box3.configure(state="normal")
            self.box3.delete(0, 'end')
            self.box3.focus()
            self.hasfocus="box3"
            self.box4.configure(state="disabled")
        elif self.hasfocus == "box5":
            if len(str(self.name5.get())) > 0:
                self.box5.delete(0, 'end')
            else:
                self.box4.configure(state="normal")
                self.box4.delete(0, 'end')
                self.box4.focus()
                self.hasfocus="box4"
                self.box5.configure(state="disabled")
        

    def createEntry(self):
        self.name1 = StringVar()
        self.box1 = ttk.Entry(self, width=2, textvariable = self.name1, font="Calibri 15")
        self.box1.place(x=128, y=31)

        self.name2 = StringVar()
        self.box2 = ttk.Entry(self, width=2, textvariable = self.name2, font="Calibri 15")
        self.box2.place(x=188, y=31)
        self.box2.configure(state="disabled")

        self.name3 = StringVar()
        self.box3 = ttk.Entry(self, width=2, textvariable = self.name3, font="Calibri 15")
        self.box3.place(x=248, y=31)
        self.box3.configure(state="disabled")

        self.name4 = StringVar()
        self.box4 = ttk.Entry(self, width=2, textvariable = self.name4, font="Calibri 15")
        self.box4.place(x=308, y=31)
        self.box4.configure(state="disabled")

        self.name5 = StringVar()
        self.box5 = ttk.Entry(self, width=2, textvariable = self.name5, font="Calibri 15")
        self.box5.place(x=368, y=31)
        self.box5.configure(state="disabled")

        self.box1.focus() ; hasfocus = "box1"
        self.name1.trace_add("write", callback1)
        self.name2.trace_add("write", callback2)
        self.name3.trace_add("write", callback3)
        self.name4.trace_add("write", callback4)


        
root=root()
root.mainloop()

评论中@furas 的解决方案:

state="normal" 工作正常,但是当您单击按钮 backspace 并删除 Entry 中的值时,它会自动更改 StringVar 中的值,这会自动运行回调(由 [=13 分配) =]) 移动到下一个条目,此回调为已删除的条目设置 state="disabled"。您必须关闭回调,或者在回调中您必须检查它是否添加或删除值并跳过 state="disabled"