Модуль Python CANopen с Tkinter - PullRequest
       31

Модуль Python CANopen с Tkinter

0 голосов
/ 04 декабря 2018

Я пытаюсь написать простой графический интерфейс для интерфейса с шиной CANopen, объединяющий модуль tkinter в Python 3.7.Моя проблема в том, что обновление графического интерфейса приводит к замедлению всей программы, и я теряю сообщения.Я довольно новичок в Python, поэтому я не уверен, является ли это присущим Python, или проблема с tkinter или что-то с моей стороны.Я использую библиотеки canopen-0.8.0 и python_can-3.0.0 с CAN-адаптером Vector ValueCAN3.Вот соответствующий код, который я использую.

Запуск:

#id_list is a list of all CANopen Id's
self.logging = True
self.q = deque()
t = threading.Thread(target = self.print_to_screen)
t.daemon = True
t.start()
for cob_id in id_list:
   self.network.subscribe(cob_id, self.save_message)

Затем у меня есть обратный вызов self.save_message, который просто сохраняет кортеж с информацией сообщения в q:

def save_message(self, cob_id, data, timestamp):
    self.q.append((cob_id, data, timestamp))

И отдельный поток, который я начал обрабатывать сообщения, которые были сохранены в q:

def print_to_screen(self):
    while(self.logging == True):
        if(len(self.q) > 0):
            self.msg_count += 1
            message = self.q.popleft() 
            byte_string = ""
            service = ""
            if (message[0] == 0x7e4 or message[0] == 0x7E5):
                service = "Layer Settings"
            elif (message[0] & 0x780) in self.SERVICES:
                service += self.SERVICES[message[0] & 0x780]
            for data_byte in map(str, map(hex, message[1])):
                byte_string = byte_string + "  " + data_byte        
            msg = [hex(message[0]), hex(message[0] & 0x1F), service, byte_string, str(message[2]), self.msg_count]
            self.message_list.insert(END, msg)
            self.message_list.see(END)

message_list - это просто список списков tkinter:

def insert(self, index, *elements):
    for e in elements:
        i = 0
        for l in self.lists:
            l.insert(index, e[i])
            i = i + 1

Шина CAN, к которой я подключен, работает на скорости 1 Мбит / с с нагрузкой около 30%Я знаю, что это быстро, но я не занимаюсь большой обработкой, я чувствую, что она должна идти в ногу.С другой стороны, я привык писать на C для встраиваемых систем практически без издержек, поэтому, возможно, я ошибаюсь.

Любой конструктивный вклад будет принят.

...