2014-01-17 36 views
0

我正在爲我的串行通信程序創建一個圖形界面。 gui的佈局設置爲我想要的,我已經開始嘗試添加一些序列代碼。但是,我遇到了一個問題。當我點擊「測試連接」按鈕或b1時,程序凍結並停止響應。不是下面的代碼遺漏了我認爲不必要的東西。 我已經將問題縮小到閱讀= ser.read(1)。由於某種原因ser.read()正在殺死它。 感謝您提前提供任何幫助!Tkinter從按鈕調用Pyserial函數時凍結

class COMS_app(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.platform_check() 
     self.initialize() 

    def initialize(self): 
     self.grid() 

     self.scrollbar = Tkinter.Scrollbar(self, orient = 'vertical', bd = 5) 
     self.scrollbar.grid(column = 2, row = 0, rowspan = 2, sticky = 'NSE') 

     self.com = Tkinter.Text(self, fg = "blue", height = 20, borderwidth = 5, padx = 5, pady = 5, relief = 'ridge') 
     self.com.grid(column = 0, row =0, columnspan = 2) 

     self.com.insert('1.0', 'COMS Terminal:') 

     self.scrollbar.config(command = self.com.yview) 

     self.inf = Tkinter.Text(self, fg = "blue", height = 8, borderwidth = 5, padx = 5, pady = 5, relief = 'ridge') 
     self.inf.grid(column = 0, row =7, columnspan = 2) 

     self.tb2Variable = Tkinter.StringVar() 
     self.tb2 = Tkinter.Entry(self,textvariable = self.tb2Variable) 
     self.tb2.grid(column=1,row=2, sticky='W') 
     self.tb2.bind("<Return>", self.OnPressEnter) 
     self.tb2Variable.set(u"Enter File Name") 


     b1 = Tkinter.Button(self, text = u"Test Connection", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick1) 
     b1.grid(column = 0, row = 1, sticky = 'W') 

     b2 = Tkinter.Button(self, text = u"Receive File", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick2) 
     b2.grid(column = 0, row = 2, sticky = 'W') 

     b3 = Tkinter.Button(self, text = u"Send AT C/D", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick3) 
     b3.grid(column = 0, row =3, sticky = 'W') 

     b4 = Tkinter.Button(self, text = u"Send Text", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick4) 
     b4.grid(column = 0, row = 4, sticky = 'W') 

     b5 = Tkinter.Button(self, text = u"End Program", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick5) 
     b5.grid(column = 0, row = 5, sticky = 'W') 

     b6 = Tkinter.Button(self, text = u"Get Help", borderwidth = 5, relief = 'ridge', command = self.OnButtonClick6) 
     b6.grid(column = 0, row = 6, sticky = 'W') 

     self.resizable(False, False) 

    def OnButtonClick1(self): 
     self.test_con() 


    def OnButtonClick2(self): 
     pass 

    def OnButtonClick3(self): 
     pass 

    def OnButtonClick4(self): 
     pass 

    def OnButtonClick5(self): 
     pass 

    def OnButtonClick6(self): 
     pass 

    def OnPressEnter(self,event): 
     pass 


    def test_con(self): 
     read = ser.read(1) 
     tran = 'OUTWAY' 
     rec = 'INWAY' 
     ser.write(tran) 
     self.inf.insert(Tkinter.INSERT, '\n<<' + tran) 
     while not read: 
      pass 
     if read == rec: 
      self.inf.insert(Tkinter.INSERT, '\n<<' +rec) 
     elif read == FALSE: 
      self.inf.insert(Tkinter.INSERT, '\n- - NO RESPONSE FROM SERVER') 
     else: 
      self.inf.insert(Tkinter.INSERT, '\n- - INVALID RESPONSE FROM SERVER: SERVER:<<' + read) 



    if __name__ == "__main__": 
     app = COMS_app(None) 
     app.title('INS Communications Beta 2.0') 
     app.mainloop() 

回答

0

我不知道什麼pyserial,但它聽起來像是ser.read(1)阻止,直到它返回一個字節。如果這是一個阻塞呼叫,那會凍結你的GUI。您必須將串行端口配置爲允許非阻塞呼叫,或者在單獨的線程中進行讀取。

+0

因此,我已經通過在不同的線程中讀取來解決問題,但我需要能夠多次調用此函數。線程只允許它運行一次。有任何想法嗎? – user3117351

+0

@ user3117351:線程不強制要求你調用一次。 –