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

问题描述 投票:1回答:1

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

这里变量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()
python loops sequence
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.