2016-10-12 19 views
0

我有一個通過Telnet會話連接到電源的python腳本。腳本的流程如下:如何使用Python Telnet收集連續數據

# Connect to Device 
tn = telnetlib.Telnet(HOST,PORT) 

# Turn On 
tn.write("OUT 1\r") 

# Get Current Voltage 
current_voltage = tn.write("MV?\r") 

# Turn Off 
tn.write("OUT 0\r") 

我希望做的是能夠得到每T毫秒(ms)的電流電壓,並能在我的Tkinter的GUI顯示,直到設備被命令關閉。理想情況下,我希望將其顯示在圖表上,以便我有電壓與時間的關係,但現在我只能使用動態文本顯示。變量current_voltage將存儲表示當前電壓值的字符串。我能做到這一點的最佳方式是什麼?謝謝。

回答

2

每毫秒可能比tkinter可以處理的要多。它取決於獲取電壓的成本有多高。如果花費的時間超過一毫秒,那麼您將需要線程或多處理。

最簡單的解決方案是使用after來安排每毫秒的數據檢索,但我不確定它能跟上。問題在於,事件循環需要時間來處理事件,並且在沒有獲取電壓時給它一個這麼小的時間窗口可能會導致一個滯後的GUI。

通用技術是編寫一個能夠完成一些工作的函數,然後再調用after自己再次調用它。

例如:

root = tk.Tk() 
... 
def get_voltage(): 
    <your code to get the voltage goes here> 

    # get the voltage again in one millisecond 
    root.after(1, get_voltage) 
... 
get_voltage() 
root.mainloop() 

另一個選擇是使用線程,那就是你有一個線程,什麼也不做,但得到的電壓信息,並把它放在一個隊列中。然後,使用與上述相同的技術,您可以將最新的電壓從隊列中拉出以供顯示。

+0

您好布賴恩,我正在尋找一個解決方案,我會寫一個方法來獲取數據每t毫秒不使用Tk()方法「之後」。我寧願它是一個獨立的方法來獲取數據。例如,有一種方法可以在w循環中連續調用獲取電流電壓方法。 – DeeTee

+0

@DeeTee:是的,如果你使用線程。在GUI線程內循環調用函數的唯一方法是使用'after'。 –

+0

你認爲你可以給我一個例子,或者僞代碼來幫助我開始嗎? – DeeTee