1. 程式人生 > >小白的Python3.6學習筆記--tkinter一步步製作GUI讀取並實時顯示採集卡資料(二)

小白的Python3.6學習筆記--tkinter一步步製作GUI讀取並實時顯示採集卡資料(二)

上次我最終做出了一個簡易的串列埠助手,其效果如下:

但在反覆執行多次之後,發現了很多小毛病,接下來一一列舉並改正:

1.在電腦未接入裝置的時候,程式執行會報錯無法執行:

       問題在哪裡呢相信你看到這個錯誤提示應該能立馬想到是哪裡了,問題正出在下面這幾行?

ListPorts = list(serial.tools.list_ports.comports())
Port_list['values'] = [i[0] for i in ListPorts]
Port_list.current(0)

      當電腦沒接入任何裝置的時候,ListPorts讀回來的是一個空表,裡邊此時沒有元素。因此當執行到Port_list.current(0)時,自然會報錯,此時是個空表,怎麼顯示錶中第一個元素?為了解決這個問題,我們需要加一個判斷表是否為空的判斷,來避免程式在未接入裝置的時候無法執行。為了提醒使用者當前是否接入裝置,我決定再加一個掃描埠按鈕,用以檢測是否有裝置接入掃描按鈕觸發的函式如下:

def scan_serial():
    global ListPorts
    ListPorts = list(serial.tools.list_ports.comports())
    if ListPorts:
        Information_Window.insert("end", '請選擇埠' + '\n')
        Information_Window.see("end")
        Port_list['values'] = [i[0] for i in ListPorts]
        Port_list.current(0)
    else:
        Port_list['values'] = ["   "]
        Port_list.current(0)
        Information_Window.insert("end", '無可用埠' + '\n')
        Information_Window.see("end")

這樣在電腦未接入裝置的時候程式便可以執行,執行效果如下:

       

      此時按一下掃描埠按鈕,操作資訊視窗便會顯示“無可用埠”,同時串列埠號後面為空白。當接入裝置後再按下掃描埠,此時串列埠號後面便可以出現當前所有裝置的埠號,接下來選擇正確的埠號後,按下開始採集便可開始採集資料,這個問題便解決了效果如下!

       

       

2.解決了上一個問題之後,我又手殘反覆運行了幾次,又發現了個問題。操作資訊視窗和接收區視窗由於使用的預設引數,導致它倆變成了可以外部輸入的文字框。沒錯,滑鼠一點便會有光標出現,你可以直接輸入任何內容,即使接收區正在採集資料你也可以直接滑鼠點選,出現游標之後就可以插入任何內容了。不僅如此,你還可以直接刪除窗口裡的任何內容效果如下:

       

       這怎麼能忍我需要把這兩個視窗設定為只讀屬性,不允許外部修改這樣一來便可以解決問題查一下文字的選項引數表,找到了這個設定!。:

       

       沒錯,將這兩個視窗的狀態屬性設定為DISABLED即可。但是注意後面,設定為DISABLED時,無法修改裡面內容,意思就是此時你程式也無法向裡邊插入內容,這兩個視窗會一直保持空白,無論外部或是程式輸入任何內容都沒反應。所以,應對的辦法就是程式需要插入內容時將視窗屬性改為師範大學,其餘時間始終保持禁用屬性!然而強迫症的我緊接著發現視窗在插入內容的時候會有游標在那裡閃閃閃,關不掉看著很難受。思考了幾秒鐘之後,我把游標顏色改成了白色,這樣視窗就乾淨了。使用了insertbackground這個引數設定。

      相關程式寫法如下:

Information_Window.configure(insertbackground='white')  # 操作資訊視窗游標顏色設為白色
Information_Window.configure(state='disabled')  # 操作資訊視窗屬性設為disabled
Information_Window.configure(state='normal')  # 操作資訊視窗屬性設為normal

Receive_Window.configure(insertbackground='white')
Receive_Window.configure(state='disabled')
Receive_Window.configure(state='normal')

解決了以上兩個問題後,串列埠助手的功能和介面得到了進一步完善。於是我便在此基礎上進行實際的GUI的改造。

實際GUI的要求如下:

       1.採集卡共有八個通道,需要有八個視窗來分開顯示採集的資料

       2.不需要向裝置傳送的功能,只需可以採集資料即可

      這樣一來我的佈局便需要大改了,我大概設計了一下佈局。

      經過簡單的修改程式碼後,我將佈局成功的實現了出來。

      接下來只需要解決接收資料這一塊即可完成任務。採集卡使用的Modbus協議的RTU方式傳輸資料,在查閱了的Modbus協議的基礎知識和使用專用的測試工具後,我們瞭解了採集卡的資料幀格式,弄明白通道地址和返回資料格式後,我們選擇了的Python裡的MinimalModbus這個庫,通過依次讀取八個通道的資料,在前面加上時間戳並將其轉換格式顯示在各自的視窗後,我們最終實現了GUI的要求的全部功能。

時間怎麼加呢,很簡單,一句程式碼就可以解決:

time.strftime("%H:%M:%S>>", time.localtime())

當然還可以顯示年月日等其他內容,只是我的視窗顯示不下了就沒加了。

至此,GUI所有功能全部實現!有哪裡不懂得可以評論問我喲。