gpt4 book ai didi

python - tkinter 和 pygame.midi 之间的冲突

转载 作者:行者123 更新时间:2023-12-01 08:13:17 26 4
gpt4 key购买 nike

我正在尝试编写一个Python 3程序,它使用tkinter设置一个Gui来显示图像(在标签中)并通过各种小部件设置许多参数。 (这部分工作正常。)

当我离开并运行使用 pygame.midi 的程序的其余部分时,我希望 Gui 保留在屏幕上输入和输出 MIDI 数据。 (它不使用 pygame 来呈现任何屏幕。)(这部分在其上也可以正常工作拥有。)

时不时地,在程序的该部分发生的情况的控制下,我想更新 Gui 和/或重置一些参数,然后返回 MIDI 内容。 (换句话说,我很高兴让 gui 处于休眠状态,直到我告诉它醒来。)这是行不通的。

我尝试将 mainloop() 命令放在 GUI 设置的末尾。我试过把它放在程序的最后。两者都不起作用。在我看来,好像 pygame.midi 所做的 midi 轮询不被允许,因为 gui 和 midi轮询涉及冲突的线程。我对么?有一个简单的解决方案吗?你能指出我可以在哪里找到它吗?

添加代码:


#!/usr/local/bin/python3

from tkinter import Tk
from tkinter import ttk
from tkinter import Frame
from tkinter import E, W
from tkinter import StringVar

import sys
import os

import pygame.midi


def do_nothing(*args):
labelbox.update()


def do_midi():
global pygame_initialized, midi_out, midi_in, msgVar
if not pygame_initialized:
pygame.init()
pygame.midi.init() # Sets PortMidi timer to zero.
midi_in = pygame.midi.Input(3, 4096)
midi_out = pygame.midi.Output(2)
pygame_initialized = True

midi_out.write_short(176, 122, 00) # turn off echo
while True:
if midi_in.poll():
midi_event_list = midi_in.read(1)
event = midi_event_list[0][0][0]

if event == 248: # timing event ignore
continue

if event > 159 or event < 128: # non key-off or key-on midi events are passed through
midi_out.write(midi_event_list)
continue

# From here on we are dealing only with key-on or key-off events

key = midi_event_list[0][0][1]
vel = midi_event_list[0][0][2]

if key == 21: # right now this is the only way back to the gui to Quit
if vel != 0:
midi_out.write_short(176, 122, 127) # Turn local control back on
return

if vel != 0: # only do this for key-on events
msgVar.set(key)

midi_out.write_short(event, key, vel)


def cleanup():
global pygame_initialized, midi_out, midi_in
root.destroy()
if pygame_initialized:
del midi_out
del midi_in
pygame.midi.quit()
sys.exit()


if __name__ == '__main__':
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0, 0)
pygame_initialized = False
global msgVar
message = "Push the Play button!"

root = Tk()

msgVar = StringVar()
msgVar.set(message)
msgVar.trace("w", do_nothing)

root.title("Testing midi")
root.geometry("900x600+200+100")

frame1 = Frame(root, width=900, height=600)
frame1.grid(column=0, row=0)

ttk.Button(frame1, text="Play", style='My.TButton', command=do_midi).grid(column=0, row=4, pady=(40, 0), sticky=W)
labelbox = ttk.Label(frame1)
labelbox.grid(column=1, row=4)
labelbox.configure(textvariable=msgVar)


ttk.Button(frame1, text="Quit", style='My.TButton', command=cleanup).grid(column=2, row=4, pady=(40, 0), sticky=E)

root.mainloop()

最佳答案

最后的代码 list 包含了我所学到的内容。基本上我不明白许多帖子中提到的正在更新的“变量”实际上是 tkinter 变量(StringVar、BooleanVar 等)。所以需要 python 变量来设置 tkinter 变量。我还认为 mainloop 会自动查找 tkinter 变量的变化并自动更新。换句话说,我不明白我需要为我想要观察的变量设置“trace”。之后,我需要了解“trace”不会自动更新,您必须使用它来触发显式“更新”。在我的实际代码中(太长,无法在此处发布),我使用 tkinter 变量通过 midi 事件“设置”来更改列表框中的选择(通过“clear”、“activate”、“selection_set”和“see”)和“update” “标签中显示的图像(链接到所选项目的索引)。据我所知,没有任何事情会自动发生。

关于python - tkinter 和 pygame.midi 之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55104007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com