在我程序的以下精简版本中,我想模拟一个交换,用户和计算机将按照随机顺序进行操作。
此处变量row
包含序列顺序。值为0表示程序正在等待用户输入(方法val0
)。值为1表示应该有一个自动过程(方法val1
)。
在交替0和1时似乎工作开始,但是一旦我们等待两次连续的自动呼叫,它就会失控。
我尝试使用after
方法,但我看不出如何以及在何处插入它。
while
循环可能在这个例子中起作用,但结束程序更复杂,序列中断,重新评估序列等等。所以我不知道它是否仍然适用。
from tkinter import *
class Application:
def __init__(self,master = None):
self.master = master
Label(master,text='press next').grid()
Button(master,text='Next',command=self.val0).grid()
self.index = IntVar()
self.index.set(0)
self.index.trace("w",self.nextTurn)
def val0(self):
print("User action")
self.index.set(self.index.get() +1)
def val1(self):
print("Automatic action")
self.index.set(self.index.get() +1)
def nextTurn(self, *args):
i = self.index.get()
if i >= len(row):
self.master.destroy()
return
if row[i] == 1:
self.val1()
if __name__ == "__main__":
row = [0,1,0,0,1,1,0,0,0,1,1,1]
root = Tk()
win = Application(root)
root.mainloop()
答案 0 :(得分:1)
您可以直接在自动操作功能中调用nextTurn
来轻松解决问题:
def val1(self):
print("Automatic action")
self.index.set(self.index.get() +1)
self.nextTurn() # call nextTurn after this action
因此,如果是自动操作,您将进入下一行位置,然后再次致电nextTurn
。
但是,如果row
因为使用递归而变得太大,则可能会出现问题。在这种情况下,您需要使用您提到的while
的另一种方法。对于第二个选项,您只需要更改nextTurn
:
def nextTurn(self, *args):
i = self.index.get()
# while it is an automatic action and it has row values, keep calling val1
while i < len(row) and row[i] == 1:
self.val1() # call automatic action
i = self.index.get() #update the row position
else:
if i >= len(row):
self.master.destroy()
return