2015-09-29 108 views
0

我想將串行值讀入我的Tkinter GUI。無論是文本窗口還是最終到每秒更新一次的文本標籤小部件。我遇到的問題是隊列類。我得到的錯誤是: AttributeError的:「的applcation」對象有沒有屬性「排隊」Python Tkinter:讀取串行值

這裏是我的代碼:

#!/usr/bin/env python 

from tkinter import * 
from tkinter import messagebox 
from time import sleep 
import picamera 
import os 
import serial 
import sys 
import RPi.GPIO as GPIO 
import _thread 
import threading 
import random 
import queue 

# Setup GPIO pin(s) 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 
GPIO.setup(18, GPIO.OUT) 
GPIO.output(18, False) 


#============================================================== 
# Declaration of Constants 
# none used 

#============================================================== 

class SerialThread(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue.Queue() 

    def read_sensor_values(self): 
     ser = serial.Serial('/dev/ttyUSB0', 9600) 
     while True: 
      if ser.inWaiting: 
       text = ser.readline(s.inWaiting) 
       self.queue.put(text) 
       self.pressures_txt.insert(0.0,values) 






class Application(Frame): 
    """ GUI Application for taking photos. """ 

    def __init__(self, master): 
     super(Application, self).__init__(master) 
     self.grid() 
     self.create_widgets() 
     self.setup_camera() 

    def create_widgets(self): 

    Checkbutton(self, text = "Read Pressure Values", variable = self.mode2, command = self.process_serial, bg = 'white').grid(row = 4, column = 0, sticky = W+E+N+S) 

    # create text field to display pressure values from arduino 
     self.pressures_txt = Text(self, height = 3, wrap = WORD) 
     self.pressures_txt.grid(row=9, column = 0, columnspan =3) 

    def process_serial(self): 
     #self.text.delete(1.0, END) 
     while self.queue.qsize(): 
      try: 
       self.text.insert(END, self.queue.get()) 
       self.pressures_txt.insert(0.0, self.queue.get()) 
      except queue.Empty: 
       pass 
     self.after('1000', self.process_serial) 
    #................. end of method: read_sensor_values ................ 


#================================================================= 
# main 
#================================================================= 

root = Tk()        # Create the GUI root object 
root.title("Control V1.0") 
app = Application(root)     # Create the root application window 
root.mainloop() 

我已經發布的代碼是整個程序的簡化版本。我刪除了被認爲不相關的部分。我在python3中運行。我懷疑我可能在縮進時出現錯誤,但我不確定。

我使用從以下鏈接的代碼爲我的串行閱讀課:

https://www.daniweb.com/programming/software-development/threads/496499/using-a-checkbutton-to-import-serial-data-into-python-tkinter

+0

那麼,你的應用程序對象沒有隊列,就像錯誤說的那樣。應用程序對象應該有一個隊列嗎? –

+0

我想從串行線程插入我的應用程序對象的文本窗口中的值。從瀏覽的角度看,通常情況下,通過一個隊列來實現這一點,但我承認我並不完全瞭解隊列過程或如何從不同的對象訪問應用程序對象內部的隊列。值應該不斷流,所以我認爲我也不需要.inWaiting。任何有關如何閱讀我的應用程序對象中的這些序列值的建議將不勝感激。 –

回答

0

的問題是,在read_sensor_valuesself.queue屬於SerialThread對象。當您在Application對象的process_serial方法中說self.queue時,它指的是Application對象不存在的queue屬性。也許你應該使SerialThread對象成爲你的Application對象的一個​​屬性。然後process_serial可以參考self.serial.queue或任何你的名字。