Проблемы с отображением Canvas с использованием tkinter - PullRequest
0 голосов
/ 01 мая 2020

Я инженер с некоторым опытом программирования, но у меня были проблемы с реализацией GUI для моего последнего проекта. Проект должен симулировать счет в реальном времени, следующий за python. У меня есть функция с именем returnLocation ( много параметров здесь ), которая использует запись mp3 для имитации живого исполнения, а при вызове предсказывает, где в музыке c оценка исполнения основана на значении i это передается ему (что в основном представляет время). Это значение сохраняется как л в моем коде. Моя оценка - это просто список заметок. Ex [A, G, D, C, E ...]. Я хочу создать код, который вызывает мой итеративный вызов моей функции returnLocation и использует вывод позиции счета для генерации визуализации заметок. В частности, я хочу, чтобы он показывал некоторые заметки по обе стороны от текущей заметки в партитуре. Это не должно быть очень красиво, но в идеале это может вызвать мою функцию returnLocation и обновить GUI таким образом, который имитирует живое исполнение. Моя текущая проблема заключается в том, что когда я использую функцию after, код запускается, но он ничего не отображает. Извините, этот вопрос настолько неясен, что было очень сложно обобщить этот проект.

Код:

hop = 1024
sr = 22050
winsize = 2048
window = 350
#calculate time per frame 
timePerFrame = 1/sr * hop
#Set the update rate by the amount of frames of the STFT between updates. 22 frames is about 1 second
framesPerStep = 22
#use this to calculate the time step of the loop
timeStep = framesPerStep*timePerFrame
Cprev = None
Dprev = None
Bprev = None
query = 'Recordings/6.mp3'
Fquery = extractChromaFeatures(query)
Y, sr  = lb.core.load(query, sr = sr)
Fref = six
score = sixI
l=0
i=0

class Note:
    def __init__(self, canvas, x1, y1):
        self.x1 = x1
        self.y1 = y1
        self.canvas = canvas
        self.note = canvas.create_oval(self.x1-7, self.y1-1, self.x1+7, self.y1+7, fill="red")
    def move_note(self, Ydif):
        self.canvas.move(self.note, 0, Ydif)
def update_notes(Notes, Yold, Ynew, Xnew):
    counter = 0
    for note in Notes:
        Ydif = (Ynew[counter]-Yold[counter])*24
        if(Xnew[counter]>0 and Xnew[counter]<len(score)):
            note.move_note(Ydif)
        counter +=1
def update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold):
    startTime = time.time()
    l,Cprev, Dprev, Bprev = returnLocation(Y,Cprev, Dprev, Bprev, framesPerStep, 22*i, Fref)
    Notes = []
    Ynew = []
    Xnew = []
    for x in range(-6 , 6, 1):
        xVal = 600 + 97*x
        if(x+l>0 and x+l<len(score)):
            yVal = score[l+x]*24
        else:
            yVal = 0
        varName = "Note" + str(x)
        varName = Note(canvas, xVal, yVal)
        Notes.append(varName)
        Ynew.append(yVal)
        Xnew.append(l+x)
    update_notes(Notes, Yold, Ynew, Xnew)
    Yold = Ynew
    i=i+1
    time.sleep(timeStep - ((time.time() - startTime) % timeStep))
    root.after(0, update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold))
# initialize root Window and canvas
root = Tk()
startTime = time.time()
root.title("Live Score Sheet")
root.resizable(False,False)
canvas = Canvas(root, width = 1200, height = 300)
canvas.pack()
l=0
Yold = [0]*12

canvas.create_line(600,0,600,300,fill="blue")

update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold)
root.mainloop(

)

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