Tkinter:entry.configure(state="normal") 在我的程序中不起作用
Tkinter: entry.configure(state="normal") not workinfg in my program
我是初学者,我正在尝试在 python 中制作一个 Wordle 游戏来练习。
每个字符都在不同的条目中,所以我只启用了重点条目,禁用了其他四个条目。
我创建了一个“退格”按钮来删除用户输入的最后一个字符。此按钮应该启用用户要删除的字符的条目,然后删除字符,然后聚焦此条目,最后禁用先前聚焦的条目。
问题是,每当我想使用退格键时,它都不会启用该条目,它只会删除其内容并禁用删除字符后的条目。
代码如下:
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"
我是初学者,我正在尝试在 python 中制作一个 Wordle 游戏来练习。
每个字符都在不同的条目中,所以我只启用了重点条目,禁用了其他四个条目。 我创建了一个“退格”按钮来删除用户输入的最后一个字符。此按钮应该启用用户要删除的字符的条目,然后删除字符,然后聚焦此条目,最后禁用先前聚焦的条目。
问题是,每当我想使用退格键时,它都不会启用该条目,它只会删除其内容并禁用删除字符后的条目。
代码如下:
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"