Python 使用按钮和绑定重复遍历列表

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):

所以我正在用TkInter(Python 3.4.3)做一个数学测试。我只想用一个框架来回答所有问题。我有一个列表,其中包含从另一个.py导入的所有字符串(
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)