簡體   English   中英

Python-無法逐步運行包含多次循環功能的函數

[英]Python - can't run a function step by step which includes a loop function several times

作為標題,我多次使用包含循環功能的函數時遇到問題。 我最想要的是欲望。 我嘗試通過一個列表來解決它,例如Funs_list = [measure(“ A”),measure(“ B”)],但是結果相同。 循環功能不會每次都逐步運行。

from Tkinter import *
import time

def measure(name):
    global voltage, data

    data = []
    if name == "A":
        voltage = -0.2
        limits = +0.2
    else:
        voltage = -0.1
        limits = +0.1
    def loop():
            global voltage , data
            data.append(round(voltage,3))

            voltage += 0.02

            if voltage > -0.01:
                voltage = 0
                data.append(round(voltage,3))
                root.after_cancel(loop)
                print 'data', data

            else:
                root.after(1000, loop)
    root.after(1, loop)



def others():
    global data

    measure("A")
    A = data
    print 'A', A


    measure("B")
    B = data
    print 'B', B

    print 'i am here'



root = Tk()
root.title("A Tool")
Button(root, text="Test other",width=38, height = 8, bg='gray',command=lambda:others()).pack()

root.mainloop()

當我按“其他”按鈕時,結果如下:

    A []
    B []
    i am here
    data [-0.1, -0.08, -0.06, -0.04, -0.02, 0.0]
    data [-0.1, -0.08, -0.06, -0.04, -0.02, 0.0, 0.0, 0.0]

但是我希望逐步獲得功能如下“其他”的結果。 我該怎么辦 ?

    data [-0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.04, -0.02, 0.0]
    A [-0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.04, -0.02, 0.0]
    data [-0.1, -0.08, -0.06, -0.04, -0.02, 0.0]
    B [-0.1, -0.08, -0.06, -0.04, -0.02, 0.0]
    i am here

我不是Tkinter專家,但是這里的問題是root.after()用法root.after()

您的函數measure()已經返回並打印了A,但是由於尚未調用root.after()因為它必須等待一些ms,所以您得到了空表。 然后,經過這些毫秒之后,您的數據將更新,但是您期望完成的一切已經結束。

我對您的代碼做了一些更改:

def measure(name):
    ...
    def loop():
            ...

            if voltage > -0.01:
                voltage = 0
                data.append(round(voltage,3))

                print ('data', data)
                return  # root.after_cancel(loop)

            else:
                loop()  # root.after(1, loop)

    loop()  # root.after(1, loop)

這是我的結果:

data [-0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.04, -0.02, 0] A [-0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.04, -0.02, 0]

如果我對問題的理解正確,則似乎您不希望在循環完成后才返回measure 在這種情況下,您可以使用tkinter的功能來等待設置變量,然后再繼續。

您可以嘗試將代碼修改為如下所示:

def measure(name):
    flag = BooleanVar()
    ...
    def loop():
        ...
        if voltage > -0.01:
            ...
            print 'data', data
            flag.set(True)
        ...
    loop()
    root.wait_variable(1000, loop)

使用上述方法,直到設置了標志, measure才會返回,並且直到循環完成,才會設置標志。

基於事件的解決方案

我個人絕不會那樣做。 似乎您要嘗試做的是說“當電壓超過閾值時執行某些操作”。 可以將升高的電壓視為另一事件,就像單擊按鈕或鍵入一些文本一樣。

在這種情況下,您可能需要創建並綁定到虛擬事件

例如,您可能要創建事件"<<Voltage-A>>""<<Voltage-B>>" ,它們表示A和B電壓上升。 您可以綁定到這些事件,以便在發生這些事件時可以執行所需的任何操作。 另外,由於僅在A上的電壓上升后才想測量B,因此可以在同一事件上觸發B的測量。

這是一個基於原始代碼的人為設計示例:

from Tkinter import *

def measure(name):
    global voltage, data

    data = []

    if name == "A":
        voltage = -0.2
        limits = +0.2
    else:
        voltage = -0.1
        limits = +0.1
    def loop():
            global voltage , data
            data.append(round(voltage,3))

            voltage += 0.02

            if voltage > -0.01:
                voltage = 0
                data.append(round(voltage,3))
                root.after_cancel(loop)
                event_name = "<<Voltage-%s>>" % name
                print 'data', data
                root.event_generate(event_name)

            else:
                root.after(1000, loop)

    loop()

def print_data(name):
    global data
    print name, data

root = Tk()
root.title("A Tool")
Button(root, text="Test other",width=38, height = 8, bg='gray',command=lambda:measure("A")).pack()

root.bind("<<Voltage-A>>", lambda event: (print_data("A"), measure('B')))
root.bind("<<Voltage-B>>", lambda event: print_data("B"))

root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM