Python Tkinter-设置字符串变量并在循环时获取条目值
我的目标是能够将字符串变量传递给两个不同的条目进行用户验证,并返回用户修改的值。如果只执行一次,代码就可以正常工作;但是,当循环时,它仅在循环的第一次迭代中正确执行。在随后的迭代中,条目的字符串变量为空 我曾经尝试过Python Tkinter-设置字符串变量并在循环时获取条目值,python,loops,tkinter,tkinter-entry,Python,Loops,Tkinter,Tkinter Entry,我的目标是能够将字符串变量传递给两个不同的条目进行用户验证,并返回用户修改的值。如果只执行一次,代码就可以正常工作;但是,当循环时,它仅在循环的第一次迭代中正确执行。在随后的迭代中,条目的字符串变量为空 我曾经尝试过update\u idletasks()和无运气的时间睡眠。我正在Windows XP上运行Python 2.4 # -*- coding: cp1252 -*- import Tkinter def retrieve_text(): app_win.quit() for
update\u idletasks()
和无运气的时间睡眠。我正在Windows XP上运行Python 2.4
# -*- coding: cp1252 -*-
import Tkinter
def retrieve_text():
app_win.quit()
for item in range(3):
numero_dossier = item+1
version_dossier = item+2
app_win = Tkinter.Tk()
l = Tkinter.Label(app_win, text="Veuillez valider les informations suivantes et les corriger au besoin :")
l.grid(row=0, column=0, columnspan=2)
l.pack()
v1 = Tkinter.StringVar()
v1.set(numero_dossier)
l1 = Tkinter.Label(app_win, text="Numéro de dossier:", anchor='w', justify='left')
e1 = Tkinter.Entry(app_win, textvariable=v1)
l1.pack()
e1.pack()
v2 = Tkinter.StringVar()
v2.set(version_dossier)
l2 = Tkinter.Label(app_win, text="Version du dossier:", anchor='w', justify='left')
e2 = Tkinter.Entry(app_win, textvariable=v2)
l2.pack()
e2.pack()
app_button = Tkinter.Button(app_win,text="OK",command=retrieve_text)
app_button.pack()
app_win.mainloop()
app_win.withdraw()
numero_dossier = e1.get().strip()
version_dossier = e2.get().strip()
print numero_dossier, version_dossier
这是根本性的突破:
for item in range(3):
...
app_win = Tkinter.Tk()
Tkinter根本不是设计成这样工作的。您的程序应该只创建类
Tk
的一个实例,并且应该调用mainloop
一次 关于为什么要多次构造小部件的问题没有任何理由,所以我认为这是一个错误。另外,一个Tkinter.Tk
实例的名称app\u win
可能会愚弄您。实例化Tkinter.Tk
会启动一个tcl解释器,然后加载Tk,作为“奖励”,Tk会给您一个窗口
更明智的方法是只创建一次小部件,然后执行您所追求的多次验证。以下是针对以下情况调整的代码:
import Tkinter
NUM_D = range(3)
VER_D = range(3)
CURR_D = 0
def retrieve_and_update_text():
global CURR_D
num_d = e1.get().strip()
ver_d = e2.get().strip()
print num_d, ver_d
CURR_D = (CURR_D + 1) % 3
v1.set(NUM_D[CURR_D] + 1)
v2.set(VER_D[CURR_D] + 2)
root = Tkinter.Tk()
l = Tkinter.Label(root, text=u"Label")
l.grid(row=0, column=0, columnspan=2)
v1 = Tkinter.StringVar()
l1 = Tkinter.Label(root, text=u"Num", anchor='w', justify='left')
e1 = Tkinter.Entry(root, textvariable=v1)
l1.grid(row=1)
e1.grid(row=1, column=1)
v2 = Tkinter.StringVar()
l2 = Tkinter.Label(root, text=u"Ver", anchor='w', justify='left')
e2 = Tkinter.Entry(root, textvariable=v2)
l2.grid(row=2)
e2.grid(row=2, column=1)
app_button = Tkinter.Button(root, text=u"OK", command=retrieve_and_update_text)
app_button.grid(row=3)
v1.set(NUM_D[CURR_D] + 1)
v2.set(VER_D[CURR_D] + 2)
root.mainloop()
多亏了Bryan Oakley和mmgp,我能够编写出以下代码来满足我的需要,尽管我在循环的每次迭代中都会打破mainloop规则。欢迎大家发表意见。再次感谢
# -*- coding: cp1252 -*-
import Tkinter
root = Tkinter.Tk()
def retrieve_and_update_text():
#global CURR_D
dossier = e1.get().strip()
version = e2.get().strip().upper()
print dossier, version
root.quit()
for item in range(3):
dossier = item+1
version = item+2
l = Tkinter.Label(root, text=u"Veuillez valider les informations suivantes et les corriger au besoin :")
l.grid(row=0, column=0, columnspan=2)
v1 = Tkinter.StringVar()
l1 = Tkinter.Label(root, text=u"Dossier :", anchor='w', justify='left')
e1 = Tkinter.Entry(root, textvariable=v1)
l1.grid(row=1)
e1.grid(row=1, column=1)
v2 = Tkinter.StringVar()
l2 = Tkinter.Label(root, text=u"Version :", anchor='w', justify='left')
e2 = Tkinter.Entry(root, textvariable=v2)
l2.grid(row=2)
e2.grid(row=2, column=1)
app_button = Tkinter.Button(root, text=u"OK", command=retrieve_and_update_text)
app_button.grid(row=3)
v1.set(dossier)
v2.set(version)
root.mainloop()
if item == range(3)[-1]: # if last item
root.withdraw()
为帮助干杯!我将Tk对象移出了循环,因此它只被调用一次。我怎样才能达到我在文章开头所说的目标?似乎应该可以使用不同的逻辑方法?这正是我所需要的,只是“OK”按钮不会刷新GUI。相反,关闭程序的“x”按钮似乎可以做到这一点。您希望以何种方式刷新GUI?通过擦除条目中的值?按“确定”按钮,StringVar和条目值应刷新为新的num\u d、ver\u d变量。干杯啊,对。这里已经发生了这种情况,您很可能需要确保显示更新。在这种情况下,在函数
retrieve\u和\u update\u text
的末尾添加一行root.update\u idletasks()
。对于访问此站点了解Tkinter的任何人来说,这段代码都是一个非常糟糕的示例。真的,我不明白你为什么坚持要重做几乎所有的错误。如果您非常想使用它,请参阅使用收回
的稍微不同的检索和更新文本
。谢谢您的评论。我要说的是,我一点也不坚持做错事。代码简单易读,最重要的是,它适用于我的用例。如果有更好的方法做事情,我会很高兴了解他们。我试着指出更好的方法,但显然我失败了。抱歉这么粗鲁,享受代码吧。