Наличие некоторых задержек с использованием python и tkinter для графического интерфейса реального времени - PullRequest
0 голосов
/ 29 мая 2019

Итак, у меня есть программа на языке matlab, которая отправляет числа от 1 до 7 в случайном порядке, мой код на python должен подсвечивать соответствующее слово, когда получает число (каждое слово относится к определенному числу, связанному с ним). Это должно быть как можно быстрее, так как это мозговой компьютерный интерфейс, а время очень важно.

Что происходит: когда я просто печатаю значения, которые я получаю из Matlab, никаких задержек не происходит, я получаю так:

b'1\n'
b'7\n'
b'4\n'
b'2\n'
b'6\n'
b'3\n'
b'1\n'
b'5\n'
etc..

Но когда я включаю часть GUI (я использовал Tkinter) и печатаю значения, это дает мне:

b'1\n'
1
b'7\n'
7
b'4\n'
4
b'2\n'
2
b'6\n'
6
b'3\n'
3
b'1\n5\n1\n'
1
5
1
b'4\n3\n7\n'
4
3
7
b'6\n2\n5\n7\n2\n'
6
2
5
etc...

Так что, когда он начинает получать несколько номеров одновременно, это сильно замедляет работу программы. Мне кажется, что либо tkinter медленен, либо цикл неправильный, но это странно, потому что это всего лишь несколько строк кода:

from tkinter import *
import time
import winsound
import socket
import sys

sounds = ["sim_esquerda_elev0_azim100.wav","nao_direita_elev0_azim100.wav",\
          "fome_esquerda_elev30_azim120.wav", "sede_direita_elev-40_azim148.wav",\
          "urinar_esquerda_elev-40_azim32.wav","ar_frente_elev0_azim0.wav",\
          "posicao_direita_elev30_azim60.wav"]

# TCP connection
try:
    so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as err:
    print ("socket creation failed with error %s" %(err))

#default port for socket
port = 2000

# default time out
#so.settimeout(1000000)

try:
    host_ip = socket.gethostbyname('localhost')
except socket.gaierror:
    # this means could not resolve the host
    print ("there was an error resolving the host")
    sys.exit()

# connecting to the server
so.connect((host_ip,port))

# MATLAB INFORMATION FOR OFFLINE EXPERIMENT
Nepoch = 10  #nr de epochs por trial
Nwords = 7   #nr de palavras (SIM, NAO, FOME, SEDE, URINAR, AR, POSICAO)
SeqTrain = [1, 3, 5, 7, 2, 4, 6, 1, 3, 5, 7, 2, 4, 6] #sequencia offline de treino

# read the TCP sequence received
def sequencia():
    num = 0
    for i in range(0,999):
        s = so.recv(port) #+ b'\n' #since the sequence received is : 1\n 2\n 5\n etc
        print(s)
        for c in s.split():
            y = int(c)
            #print(c)
            #feedbak offline (for the user to know which are the words)
            if (num in (0, Nepoch*Nwords+1, Nepoch*Nwords*2+2, Nepoch*Nwords*3+3, Nepoch*Nwords*4+4, Nepoch*Nwords*5+5,\
                    Nepoch*Nwords*6+6)):
                labels1[y-1].configure(foreground="white")
                root.update()
            elif (num in (Nepoch*Nwords*7+7, Nepoch*Nwords*8+8, Nepoch*Nwords*9+9, Nepoch*Nwords*10+10,\
                     Nepoch*Nwords*11+11, Nepoch*Nwords*12+12, Nepoch*Nwords*13+13)):
                labels2[y-1].configure(foreground="white")
                root.update()
            else:
                labels[y-1].configure(background="green",foreground="red")
                root.update()
                winsound.PlaySound(sounds[y-1], winsound.SND_FILENAME)
                labels[y-1].configure(background="gray",foreground="white")
                root.update()
            num = num + 1
#window 
root = Tk()
root.title("Sequencia")
#root.attributes('-fullscreen', True)  #for fullscreen
#root.bind('<Escape>',lambda e: root.destroy()) #to get out of the full screen
root.state('zoomed')  #just zoomed not fullscreen
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
fm = Frame(root, width=w, height=h, bg="black")

#draw center lines
#wi = Canvas(fm, width=20, height=20, bg ="green", selectborderwidth=0)
#wi.create_line(0, 200, 150, 150, width=10, fill="blue")


#~~~~~~~~~~~~~LABELS FOR THE OFFLINE TEST TO SHOW UP IN THE SCREEN~~~~~~~~~~~~~
label_sim1 = Label(fm, width=10, height=1, bg="black", text = "SIM",  font = ('TkDefaultFont',15), fg="black")
label_nao1 = Label(fm, width=10, height=1, bg="black", text = "NÃO", font = ('TkDefaultFont',15), fg="black")
label_fome1 = Label(fm, width=10, height=1, bg="black", text = "FOME", font = ('TkDefaultFont',15), fg="black")
label_sede1 = Label(fm, width=10, height=1, bg="black", text = "SEDE", font = ('TkDefaultFont',15), fg="black")
label_urinar1 = Label(fm, width=10, height=1, bg="black", text = "URINAR", font = ('TkDefaultFont',15), fg="black")
label_ar1 = Label(fm, width=10, height=1, bg="black", text = "AR", font = ('TkDefaultFont',15), fg="black")
label_posicao1 = Label(fm, width=10, height=1, bg="black", text = "POSIÇÃO", font = ('TkDefaultFont',15), fg="black")

labels1 = [label_sim1,label_nao1,label_fome1,label_sede1,label_urinar1,label_ar1,label_posicao1]

label_sim2 = Label(fm, width=10, height=1, bg="black", text = "SIM",  font = ('TkDefaultFont',15), fg="black")
label_nao2 = Label(fm, width=10, height=1, bg="black", text = "NÃO", font = ('TkDefaultFont',15), fg="black")
label_fome2 = Label(fm, width=10, height=1, bg="black", text = "FOME", font = ('TkDefaultFont',15), fg="black")
label_sede2 = Label(fm, width=10, height=1, bg="black", text = "SEDE", font = ('TkDefaultFont',15), fg="black")
label_urinar2 = Label(fm, width=10, height=1, bg="black", text = "URINAR", font = ('TkDefaultFont',15), fg="black")
label_ar2 = Label(fm, width=10, height=1, bg="black", text = "AR", font = ('TkDefaultFont',15), fg="black")
label_posicao2 = Label(fm, width=10, height=1, bg="black", text = "POSIÇÃO", font = ('TkDefaultFont',15), fg="black")

labels2 = [label_sim2,label_nao2,label_fome2,label_sede2,label_urinar2,label_ar2,label_posicao2]

#posicionamento das palavras: [1, 3, 5, 7, 2, 4, 6, 1, 3, 5, 7, 2, 4, 6] sim, fome, urinar, posição, nao, sede, ar, sim, fome, urinar, posição, nao, sede, ar
fm.pack()
label_sim1.place(relx=0.09, rely=0.07, anchor=CENTER)
label_fome1.place(relx=0.14, rely=0.07, anchor=CENTER)
label_urinar1.place(relx=0.2, rely=0.07, anchor=CENTER)
label_posicao1.place(relx=0.27, rely=0.07, anchor=CENTER)
label_nao1.place(relx=0.32, rely=0.07, anchor=CENTER)
label_sede1.place(relx=0.37, rely=0.07, anchor=CENTER)
label_ar1.place(relx=0.42, rely=0.07, anchor=CENTER)

label_sim2.place(relx=0.46, rely=0.07, anchor=CENTER)
label_fome2.place(relx=0.515, rely=0.07, anchor=CENTER)
label_urinar2.place(relx=0.575, rely=0.07, anchor=CENTER)
label_posicao2.place(relx=0.645, rely=0.07, anchor=CENTER)
label_nao2.place(relx=0.695, rely=0.07, anchor=CENTER)
label_sede2.place(relx=0.745, rely=0.07, anchor=CENTER)
label_ar2.place(relx=0.80, rely=0.07, anchor=CENTER)


#~~~~~~~~~~LABELS OF THE PARADIGM~~~~~~~~~~
label_sim = Label(fm, width=10, height=1, bg="gray", text = "SIM",  font = ('TkDefaultFont',28), fg="white")
label_nao = Label(fm, width=10, height=1, bg="gray", text = "NÃO", font = ('TkDefaultFont',28), fg="white")
label_fome = Label(fm, width=10, height=1, bg="gray", text = "FOME", font = ('TkDefaultFont',28), fg="white")
label_sede = Label(fm, width=10, height=1, bg="gray", text = "SEDE", font = ('TkDefaultFont',28), fg="white")
label_urinar = Label(fm, width=10, height=1, bg="gray", text = "URINAR", font = ('TkDefaultFont',28), fg="white")
label_ar = Label(fm, width=10, height=1, bg="gray", text = "AR", font = ('TkDefaultFont',28), fg="white")
label_posicao = Label(fm, width=10, height=1, bg="gray", text = "POSIÇÃO", font = ('TkDefaultFont',28), fg="white")

labels = [label_sim,label_nao,label_fome,label_sede,label_urinar,label_ar,label_posicao]

#ordem de sequencia (1 2 3 4 5 6 7): (SIM, NAO, FOME, SEDE, URINAR, AR, POSICAO)
#posicionamento das palavras: 
fm.pack()
label_ar.place(relx=0.5, rely=0.15, anchor=CENTER)
label_posicao.place(relx=0.70, rely=0.3, anchor=CENTER)
label_urinar.place(relx=0.3, rely=0.3, anchor=CENTER)
label_nao.place(relx=0.72, rely=0.55, anchor=CENTER)
label_sim.place(relx=0.28, rely=0.55, anchor=CENTER)
label_sede.place(relx=0.60, rely=0.77, anchor=CENTER)
label_fome.place(relx=0.4, rely=0.77, anchor=CENTER)

root.update()
sequencia()


Есть ли у вас идеи, почему это происходит? или советы по улучшению? Я уже пытался отделить код от потоков, и он не работал Это Ткинтер плохой вариант? Или даже питон? Большое спасибо

1 Ответ

0 голосов
/ 29 мая 2019

Звонки на update, вероятно, главное замедление цикла.Каждый раз, когда вы вызываете его, он пытается обслуживать все ожидающие события.Вы должны вызывать его только раз в несколько сотен миллисекунд.

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

...