Проблема обновления Tkinter с изображением этикетки и серийным таймаутом через 1 минуту - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь получить массив последовательных данных из arduino и использовать их в качестве координат для меток с Python3 в моем Raspberry Pi 3. Я могу получить массивы с последовательными и разместить метки, как я хочу. Программа работает. Но Первая проблема в том, что я вижу мерцание и время задержки мерцания становится хуже со временем. Вторая проблема - программа перестает работать через несколько минут.

Я попробовал ser.flushInput () и каждый раз очищал свои массивы, и результат один и тот же.

from tkinter import *
import serial
root = Tk()
root.geometry("1024x600")
ser = serial.Serial('/dev/ttyAMA0',115200)
ser.timeout=None

data=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
data1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
image=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
label=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
x1=[210,210,210,370,370,370,530,530,530,690,690,690,850,850,850,850]
y1=[440,325,75,440,325,75,440,325,75,440,325,75,440,325,200,75]

image_gri=PhotoImage(file="/home/pi/python/gri.gif")
image_kirmizi = PhotoImage(file="/home/pi/python/kirmizi.gif")
image_yesil = PhotoImage(file="/home/pi/python/yesil.gif")

def kontrol():
 data=[]
 ser.flush()
 ser.flushInput()
 data = ser.read(32)
 #print(data)

 for i in range(0,16):
      if data[i]==49 and data[i+16]==49:

            image[i]=image_yesil
            label[i] = Label(root, image=image[i])
            label[i].place(x=x1[i],y=y1[i])


      elif data[i]==49 and data[i+16]==48:
            image[i]=image_kirmizi
            label[i] = Label(root, image=image[i])
            label[i].place(x=x1[i],y=y1[i])

      else :
            image[i]=image_gri
            label[i] = Label(root, image=image[i])
            label[i].place(x=x1[i],y=y1[i])


 ser.flush()
 ser.flushInput()               
 root.after(50,kontrol)
 root.update()
kontrol()
#root.after(50,kontrol)
mainloop()

Я хочу, чтобы программа работала до 12 часов, и не вижу мерцания, когда она работает.

1 Ответ

0 голосов
/ 26 апреля 2019

Проблема в том, что вы добавляете 16 виджетов Label при каждом запуске, которые хранятся в памяти и обрабатываются каждый раз. Старые ярлыки никогда не удаляются.

Чтобы решить эту проблему, вы можете удалить предыдущую метку при создании новой, используя label[i].destroy(). Еще лучше просто обновить существующую метку, а не создавать новую, используя label[i].config(image=...).

Ниже приведен полностью рабочий пример (с некоторым закомментированным кодом и использованием вместо этого случайных данных и фиктивных изображений, поэтому любой, кто использует Python 3, может запускать это без внешних зависимостей):

import random
from tkinter import *
# import serial

root = Tk()
root.geometry("1024x600")
# ser = serial.Serial('/dev/ttyAMA0', 115200)
# ser.timeout = None

# If you have the images, use this:
#IMAGE_GRI = PhotoImage(file="/home/pi/python/gri.gif")
#IMAGE_KIRMIZI = PhotoImage(file="/home/pi/python/kirmizi.gif")
#IMAGE_YESIL = PhotoImage(file="/home/pi/python/yesil.gif")

# Otherwise, create some dummy images for demonstration purposes:
WIDTH = 64
HEIGHT = 64
DATA = ','.join(['0x00' for i in range(WIDTH * HEIGHT // 8)])
BITMAP = '#define im_width %d\n#define im_height %d\nstatic char im_bits[] = {\n%s\n};' % (WIDTH, HEIGHT, DATA)
IMAGE_GRI = BitmapImage(data=BITMAP, background="grey")
IMAGE_KIRMIZI = BitmapImage(data=BITMAP, background="red")
IMAGE_YESIL = BitmapImage(data=BITMAP, background="green")

# Initialize with grey images (you may choose a different image, of course)
label = [Label(root, image=IMAGE_GRI) for i in range(16)]

x1 = [210, 210, 210, 370, 370, 370, 530, 530, 530, 690, 690, 690, 850, 850, 850, 850]
y1 = [440, 325, 75, 440, 325, 75, 440, 325, 75, 440, 325, 75, 440, 325, 200, 75]

# Place the images only once:
for i in range(16):
    label[i].place(x=x1[i], y=y1[i])

def kontrol():
    data = []
    # ser.flush()
    # ser.flushInput()
    # data = ser.read(32)
    # Create random data for demonstration purposes:
    data = [random.choice((48, 49)) for i in range(32)]
    #print(data)

    for i in range(16):
        if data[i] == 49 and data[i+16] == 49:
            label[i].config(image=IMAGE_YESIL)  # update image!
        elif data[i] == 49 and data[i+16] == 48:
            label[i].config(image=IMAGE_KIRMIZI)  # update image!
        else:
            label[i].config(image=IMAGE_GRI)  # update image!

    # ser.flush()
    # ser.flushInput()
    root.after(50, kontrol)
    # root.update()  # Not necessary! Use root.update_idletasks() if necessary.

kontrol()
mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...