Я пытаюсь написать простой графический интерфейс для интерфейса с шиной 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 для встраиваемых систем практически без издержек, поэтому, возможно, я ошибаюсь.
Любой конструктивный вклад будет принят.