2015-01-27 3 views
0

Я пишу код на Python, чтобы создать графический интерфейс, управляющий электронной доской. Я помещал кнопки в графический интерфейс и отправлял команды, нажимая на него. Эта часть работает. Но мне нужно получить информацию, поступающую с доски, чтобы изменить некоторые вещи в графическом интерфейсе. Именно этой части мне это не удается. Я нашел несколько советов в this question, что позволяет мне читать COM-порт без GUI. Когда я пытаюсь добавить окно с полем ввода и обновить его с помощью входящих значений, я ничего не вижу.
Вот мой код:Последовательная связь с Tkinter

import serial 
import threading 
from time import sleep 
from Tkinter import* 
import sys 

wind=Tk() 
global var 
var=StringVar(wind) 
var.set("value 1") 
entry_COM=Entry(wind,textvariable=var) 
entry_COM.place(x=0,y=0,width=100,height=50)   
ser = serial.Serial(port='COM1',baudrate=115200,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=0) 
global thread 
thread= None 
stop_task = threading.Event() 

def do_task(): 
    global var 
    var.set("value 2") 
    for i in xrange(1): 
     if stop_task.is_set(): 
      break 
     print(i) 
     sleep(1) 

while True: 
     byte = ser.read(1) # No need for a loop here, read(1) returns a length 1 string 
     character = byte # I'm not familiar with the serial module, but I think this isn't needed 
     if character == 'S': 
      # We check that we are not executing the task already, and if so we handle it accordingly 
      if thread: 
       print('Error: a task is already running!') 
       continue 
      # Start the task in a thread 
      stop_task.clear() 
      thread = threading.Thread(target=do_task) 
      thread.start() 
     elif character == 'K': 
      print('K received -> BREAK FROM TASK') 
      if thread: 
       stop_task.set() 
       thread = None 
     elif character == 'E': 
      ser.close() 
      print "closed" 
      try: 
       wind.destroy() 
      except: 
       pass 
      sys.exit() 
     wind.mainloop() 

Когда я запускаю его, окно не открывается, но остальное работает отлично. У вас есть подсказки для меня?

+0

возможно дубликат [Динамически обновления Tkinter на основе последовательных данных] (http://stackoverflow.com/questions/10574821/dynamically-updating-tkinter-window-based-on-serial-data) –

ответ

0

На самом деле я преуспел в этом сценарий, который читает то, что я посылаю и позвольте мне написать цепочку, когда я нажимаю кнопку из последовательного импорта * из Tkinter импорта *

class serial_test(object): 
    def __init__(self): 
     self.serialPort = "COM1" 
     self.baudRate = 9600 
     self.ser = Serial(self.serialPort , self.baudRate, timeout=0, writeTimeout=0) #ensure non-blocking 
     #make a TkInter Window 
     self.root = Tk() 
     self.root.wm_title("Reading Serial")  
     # make a scrollbar 
     self.scrollbar = Scrollbar(self.root) 
     self.scrollbar.pack(side=RIGHT, fill=Y)  
     # make a text box to put the serial output 
     self.log = Text (self.root, width=30, height=30, takefocus=0) 
     self.log.pack()  
     # attach text box to scrollbar 
     self.log.config(yscrollcommand=self.scrollbar.set) 
     self.scrollbar.config(command=self.log.yview) 
     #make our own buffer 
     self.buff=0 
     self.bou=Button(self.root,text='Valid',command=self.writeSerial) 
     self.bou.pack() 
     self.root.after(100, self.readSerial)   
     self.root.protocol("WM_DELETE_WINDOW", self.Intercept) 
     self.root.mainloop() 
    def Intercept(self): 
     try : 
      self.ser.close() 
     except: 
      pass 
     self.root.destroy() 
    def writeSerial(self): 
     self.ser.write("Testing") 

    def readSerial(self): 
     while True: 
      self.c = self.ser.read() # attempt to read a character from Serial 
      #was anything read? 
      if len(self.c) == 0: 
       break 
      # get the buffer from outside of this function 
      self.log.insert(END, self.c) 
      self.buff=self.buff+1 
      if self.c == '\r': 
       for i in range(30-self.buff): 
        self.log.insert(END, ' ') 
        self.buff=0 

      if self.buff==30: 
       self.buff=0 
     self.root.after(10, self.readSerial) # check serial again soon 
serial_test() 
Смежные вопросы