在我的程序的以下精简版本中,我想模拟一个交换,其中用户和计算机将按照随机顺序进行操作。
这里变量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()
您可以通过直接在自动操作功能中调用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