Python 使用按钮和绑定重复遍历列表
所以我正在用TkInter(Python 3.4.3)做一个数学测试。我只想用一个框架来回答所有问题。我有一个列表,其中包含从另一个.py导入的所有字符串(Python 使用按钮和绑定重复遍历列表,python,list,python-3.x,tkinter,iteration,Python,List,Python 3.x,Tkinter,Iteration,所以我正在用TkInter(Python 3.4.3)做一个数学测试。我只想用一个框架来回答所有问题。我有一个列表,其中包含从另一个.py导入的所有字符串(QStringList),这些字符串用作标签的文本变量 当用户按下Return或按钮时,我想迭代到列表中的下一项,因此会显示一个新问题。 使用我当前的代码,我只能成功地执行一次。大概是因为“CurrentQ”变量每次都被设置回0。 如何做到这一点,以便每次调用该函数时,都会显示下一个列表项 此代码位于我的TestPage(tk.Frame):
QStringList
),这些字符串用作标签的文本变量
当用户按下Return或按钮时,我想迭代到列表中的下一项,因此会显示一个新问题。
使用我当前的代码,我只能成功地执行一次。大概是因为“CurrentQ”变量每次都被设置回0。
如何做到这一点,以便每次调用该函数时,都会显示下一个列表项
此代码位于我的TestPage(tk.Frame):
类中
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
CurrentQ = 0
#QUESTION LABEL
self.CurrentQStringVar = tk.StringVar()
self.CurrentQString = tk.Label(self, textvariable=self.CurrentQStringVar,
anchor='w',fg="black", bg="yellow", font=STANDARD_FONT)
self.CurrentQString.grid(column=0,row=0,columnspan=2, sticky='EW')
self.CurrentQStringVar.set(QStringList[CurrentQ])
#ANSWER ENTRY BOX
self.UserAnsEntryVar = tk.StringVar()
self.UserAnsEntry = tk.Entry(self,textvariable=self.UserAnsEntryVar)
self.UserAnsEntry.grid(column=0,row=1,sticky='EW')
self.UserAnsEntry.bind("<Return>",
lambda event, CurrentQ=CurrentQ:
self.TestEnterKey(self,CurrentQ))
self.UserAnsEntryVar.set("")
#ANSWER BUTTON
self.UserAnsButtonVar = tk.StringVar()
self.UserAnsButton = ttk.Button(self,text="ENTER",
command= lambda: self.TestEnterKey(self,CurrentQ))
self.UserAnsButton.grid(column=0,row=2,columnspan=2, stick='EW')
def TestEnterKey(self,event,CurrentQ):
CurrentQ += 1
self.CurrentQStringVar.set(QStringList[CurrentQ])
return CurrentQ
首先,不要使用
lambda
。Lambda有它的用途,但在Tkinter程序中很少需要它,而且它常常只会使代码更加复杂,而不会给出任何回报
相反,让从绑定和按钮调用的函数在需要时获取所需数据。由于绑定发送事件而命令按钮不发送,因此只需将事件参数设置为可选
另外,将CurrentQ
作为对象的一个属性,使其易于访问且不必传递
def __init__(self,parent,controller):
...
self.CurrentQ = 0
...
self.UserAnsEntry.bind("<Return>",self.TestEnterKey)
...
self.UserAnsButton = ttk.Button(self,text="ENTER", command=self.TestEnterKey)
...
def TestEnterKey(self,event=None):
self.CurrentQ += 1
self.CurrentQStringVar.set(QStringList[self.CurrentQ])
最后,您可能想考虑不使用标签<代码> Strimava<代码>。除非您在多个位置使用
StringVar
,否则实际上没有必要。没有它,您仍然可以更改标签中的文本,但是您的项目中需要管理的对象少了一个
例如:
import itertools
...
self.questions = itertools.cycle(self.QStringList)
...
# this will always return the next question, looping
# back over the list as needed
next_question = self.questions.next()
question = self.questions.next()
self.CurrentQString.configure(text=question)
@请将问题列表添加到您的代码中,以使其完全工作。啊,是的,对不起,我已将其添加到底部,谢谢请提供您的完整代码,因为缺少一些内容(类定义、生成类实例、mainloop(),…)。因此,您的代码无法运行。请提供一个最低限度的工作示例。谢谢!那真有魅力!我很高兴来到这里,我从来没有想到过。你可能帮我节省了几个小时(这很好,因为周一学校又开学了,到时候应该可以结束了)。
question = self.questions.next()
self.CurrentQString.configure(text=question)