2012-04-30 4 views
3

Я пытаюсь создать приложение для прослушивания последовательного порта Python.Запуск фонового цикла на Python

Моя проблема заключается в том, что функция прослушивателя работает на фоне, не убивая графический интерфейс.

Здесь код:

import sys 
import getopt 
import serial 
from time import sleep 
from threading import * 
from Tkinter import * 
import io 
#ser = serial.serial_for_url('loop://', timeout=1) 
#sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) 

runing = True 
ser = None 
class App: 
    global ser 
    def __init__(self, master): 
    varCOM = StringVar(master) 
    varCOM.set("COM1") 
    listbox = OptionMenu(master, varCOM, "COM1", "COM2", "COM3", "COM4") 
    listbox.grid(row=0, column=0) 

    varBaudRate = StringVar(master) 
    varBaudRate.set(4800) 
    listboxBaudrate = OptionMenu(master, varBaudRate, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400) 
    listboxBaudrate.grid(row=0, column=1) 

    varParity = StringVar(master) 
    varParity.set("None") 
    listboxParity = OptionMenu(master, varParity, "None", "Even", "ODD", "Mark", "Space") 
    listboxParity.grid(row=1, column=0) 

    varDataBits = StringVar(master) 
    varDataBits.set(8) 
    listboxDataBits = OptionMenu(master, varDataBits, 5, 6, 7, 8) 
    listboxDataBits.grid(row=1, column=1) 

    varStopBits = StringVar(master) 
    varStopBits.set(2) 
    listboxStopBits = OptionMenu(master, varStopBits, 1, 2) 
    listboxStopBits.grid(row=2, column=0) 

    def detener(): 
    global runing 
    runing = False 
    detencion = Thread(target=detener) 

    def detencionRun(): 
    detencion.run() 

    def write(): 
    while runing == True: 
     #sleep(10) 
     line = ser.read(14) 
     if line: 
     print line 
     file.write(line) 
    itinerancia = Thread(target=write) 

    def openPort(port='COM1', baudrate=1920, bytesize=8, parity='N', stopbits=1): 
    try: 
     global ser 
     global file 
     port = varCOM.get() 
     baudrate = int(varBaudRate.get()) 
     bytesize = int(varDataBits.get()) 
     stopbits = int(varStopBits.get()) 
     ser = serial.Serial(port=port, baudrate=baudrate, bytesize=bytesize, parity=parity, stopbits=stopbits) 
     file = open("lecture.txt", "a") 
     file.write("-- INICIO PROGRAMA --\n") 

     itinerancia.run() 
     #while runing == True: 
     # line = ser.read(14) 
     # if line: 
     # print line 
     # file.write(line) 
     file.write("\n-- FIN DEL PROGRAMA --\n") 
     file.close() 
    except serial.SerialException: 
     print 'No se pudo abrir el puerto' 
    return 

    def ejecutar(): 
    detener = Button(master, text="Detener", command=detencionRun) 
    detener.grid(row=3, column=0) 

    t = Thread(target=openPort) 
    t.run() 

    ejecutar = Button(master, text="Ejecutar", command=ejecutar) 
    ejecutar.grid(row=3, column=1) 


if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

приложение зависает в то время цикла. The app freezed Извините за мои плохой английский и кодирование (я новичок в Python)

ответ

0

Вы можете попробовать многопоточное приложение и поставить опрос и запись файлов в других потоках, или вы можете попробовать парцелляции из порта чтения и файл записывается в более мелкие куски внутри более крупного программного цикла, так что обработка больших фрагментов данных не будет полностью блокировать выполнение программы. Просто имейте в виду, что если вы попытаетесь его разобрать, вам, вероятно, захочется настроить содержимое буфера чтения и записи, чтобы вы случайно не удалили или не перезаписали данные в памяти до того, как будете полностью написаны или обработаны Это.

Смежные вопросы