Python - 对同一方法的连续随机调用

时间:2018-03-02 00:38:40

标签: python loops sequence

在我程序的以下精简版本中,我想模拟一个交换,用户和计算机将按照随机顺序进行操作。

此处变量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()

1 个答案:

答案 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