Python Tk _tkinter.TclError: 无效的命令名称 ".42818376

3 投票
2 回答
6518 浏览
提问于 2025-04-18 01:55

我遇到了帖子标题中提到的错误,我真的只想让这个程序正常工作。我已经在这个问题上纠结了很久,感觉很沮丧。我的最终目标是获取变量 text、chkvar 和 v 的值。

感谢任何能回复并提供帮助的人!!

#!C:/Python27/python.exe

from Tkinter import *
import ImageTk, Image

root = Tk()
root.title('HADOUKEN!')

def killwindow():
  root.destroy()

text = Text(root, height=16, width=40)
scroll = Scrollbar(root, command=text.yview)

text.configure(yscrollcommand=scroll.set)

text.grid(sticky=E)
scroll.grid(row=0,column=1,sticky='ns')

text.focus()

chkvar = IntVar()
chkvar.set(0)
c = Checkbutton(root, text="CaseIt", variable=chkvar)
c.grid(row=1,column=0,sticky=W)

v = ""
radio1 = Radiobutton(root, text="Src", variable=v, value=1)
radio1.grid(row=1,column=0)
radio1.focus()

radio2 = Radiobutton(root, text="Dst", variable=v, value=2)
radio2.grid(row=2,column=0)

b1 = Button(root, text="Submit", command=killwindow)
b1.grid(row=1, column=2)

img = ImageTk.PhotoImage(Image.open("Hadoken.gif"))
panel = Label(root, image = img)
panel.grid(row=0, column=2)

root.mainloop()


tk1 = text.get(text)
tk2 = chkvar.get(chkvar)
tk3 = v.get(v)


print tk1
print tk2
print tk3

2 个回答

7

一旦 mainloop 结束,界面上的小部件就不再存在了。当你使用 text.get(text) 时,其实是在尝试访问一个已经被删除的小部件。Tkinter 的设计就是不允许你在主窗口被关闭后再去访问这些小部件。

解决这个问题的简单方法是修改 killwindow,在它关闭窗口之前先获取需要的值,并把这些值存储在一个全局变量中,这样你就可以在 mainloop 结束后访问这些值。

1

这个程序在获取变量的时候出了问题,所以它没有报告错误的方法调用。我对原来的代码做了一些修改(增加了一个叫 textval 的字符串变量,并把 v 变量改成了另一个整数变量)。我觉得“相关变量”应该不会有问题,所以不需要在 killwindow 代码里包含它们。在 killwindow 里,我只获取了文本数据这个变量。

下面是修改后的代码(修改的行用 #++ 标记):

#!C:/Python27/python.exe

from Tkinter import *
import ImageTk, Image

root = Tk()
root.title('HADOUKEN!')

textval = StringVar() #++ added

def killwindow():
    textval.set(text.get('1.0',END)) #++ grab contents before destruction
    root.destroy()

text = Text(root, height=16, width=40)
scroll = Scrollbar(root, command=text.yview)

text.configure(yscrollcommand=scroll.set)

text.grid(sticky=E)
scroll.grid(row=0,column=1,sticky='ns')

text.focus()

chkvar = IntVar()
chkvar.set(0)
c = Checkbutton(root, text="CaseIt", variable=chkvar)
c.grid(row=1,column=0,sticky=W)

v = IntVar() #++ changed
v.set(1) #++ initial value
radio1 = Radiobutton(root, text="Src", variable=v, value=1)
radio1.grid(row=1,column=0)
radio1.focus()

radio2 = Radiobutton(root, text="Dst", variable=v, value=2)
radio2.grid(row=2,column=0)

b1 = Button(root, text="Submit", command=killwindow)
b1.grid(row=1, column=2)

img = ImageTk.PhotoImage(Image.open("Hadoken.gif"))
panel = Label(root, image = img)

panel.grid(row=0, column=2)

root.mainloop()

# windows are destroyed at this point

tk1 = textval.get() #++ changed
tk2 = chkvar.get() #++ changed
tk3 = v.get() #++ changed

print tk1
print tk2
print tk3

撰写回答