[英]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.