Python 线程仅在从另一个模块调用时才有效

格雷厄姆·波特

我正在开发一个从 Kivy 应用程序中接受 MIDI 键盘输入(使用 Mido)的应用程序。目标是让一个线程不断轮询 MIDI 输入并将事件路由到 pyfluidsynth,同时并行运行传统的 Kivy 应用程序。我需要某种并行进程,否则只要循环运行时 MIDI 轮询,K​​ivy UI 就会冻结。

经过多次摆弄,我让它工作了,但我有点担心代码。我尝试在 [if name == " main "]下启动线程,但只能运行一个进程,然后运行另一个进程。

然后不小心留下了mido_midi.py的最后两行代码,本来只是为了测试,我得到了想要的效果。现在,当我运行 main.py 时,我得到了应用程序和键盘输入。除了关闭应用程序时的一些丑陋行为外,事情似乎按我想要的方式工作。

我担心的是,我似乎无法通过从 main 调用所有内容来使线程工作。由于一切正常,我不明白为什么,这对我来说是错误的。我想我会把它扔给更聪明的人以获得洞察力。

我做得对吗?如果没有,我需要改变什么?谢谢。

主要.py:

from kivy.app import App
from kivy.uix.widget import Widget
from mido_midi import start_synth, KeyboardInput

class MyApp(App):
    def build(self):
        return GameWidget()

class GameWidget(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        ...
        self.midikeyboard = KeyboardInput()
        ...

if __name__ == "__main__":
    app = MyApp()
    app.run()

mido_midi.py:

import mido
import fluidsynth
import threading

def start_synth(driver, sound, channel=0):
    fs = fluidsynth.Synth(samplerate=24000, gain=0.8)
    fs.start(driver)
    sfid = fs.sfload(sound)
    fs.program_select(channel, sfid, 0, 0)
    # print("Midi loaded...")
    return fs

class KeyboardInput(threading.Thread):
    def __init__(self, device='Keystation 88 Port 1', driver='coreaudio', sound='sounds/Wii_Grand_Piano.sf2', channel=0):
        super(KeyboardInput, self).__init__()
        self.played_notes = []
        self.device = device
        self.driver = driver
        self.sound = sound
        self.channel = channel
        self.inport = mido.open_input(self.device)
        self.fs = start_synth(self.driver, self.sound)

    def run(self):
        for msg in self.inport:
            print(msg)
            note = msg.note
            velocity = msg.velocity
            self.fs.noteon(self.channel, note, velocity)

# Code outside of the class, intended for testing
m = KeyboardInput()
m.start()
约翰·安德森

KeyboardInput当您执行from mido_midi import start_synth, KeyboardInput“测试”行时,您的代码正在启动线程if __name__ == "__main__":构造旨在防止在导入包含该构造的文件时发生这种情况。另请注意,您有两个不同的KeyboardInput. 不确定这是否是您的意图。

您应该能够通过在if __name__ == "__main__":添加相同的两行来启动内的线程

m = KeyboardInput()
m.start()

如果你真的只想要一个实例KeyboardInput,你应该能够做到

self.midikeyboard.start()

在你的__init__()方法里面GameWidget

此外,如果您想更轻松地关闭,请添加daemon=True到构造函数调用中,或者:

m = KeyboardInput(daemon=True)   

要么

self.midikeyboard = KeyboardInput(daemon=True)

daemon=True意味着该线程将在应用程序完成后立即终止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从另一个具有主函数的python模块调用单个方法

来自分类Dev

在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

来自分类Dev

问题 - IE 上的 Ajax 调用仅在浏览器中打开具有相同 Ajax 调用的另一个页面时才有效

来自分类Dev

JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

来自分类Dev

在Python中将列表的每个元素与另一个列表的每个元素相乘/相加/分隔的有效方法

来自分类Dev

这两个简单的python代码有什么不同?(一个有效,另一个无效)

来自分类Dev

Groovy 元编程 (getProperty) 仅在从类外部调用时才有效?

来自分类Dev

为什么将文本写入文件仅在从终端调用时才有效?

来自分类Dev

在另一个函数中调用时未定义函数(Python)

来自分类Dev

如何从Colab中的另一个python模块调用自定义模块

来自分类Dev

如何通过另一个数据框的值在python / pandas中以最有效的方式标记一个数据框的列?

来自分类Dev

Python多重处理:从具有传递变量的另一个脚本中进行多重处理的调用模块

来自分类Dev

Python-如何在另一个模块中调用一个模块的主要功能?

来自分类Dev

Python多线程使用另一个线程中的一个线程的数据

来自分类Dev

是否可以强制某个浮点数的指数或有效位数与另一个浮点数匹配(Python)?

来自分类Dev

如果Python不支持方法重载,那么为什么此方法重载有效而另一个不起作用?

来自分类Dev

如何有效地将字典中的字符串列表与Python中的另一个字典列表进行比较?

来自分类Dev

通过从另一个列表执行查找来替换元组列表中元素的有效方法(python)

来自分类Dev

从另一个线程关闭Python BasicHTTPServer

来自分类Dev

Python argparse可选参数仅在正确位置输入时才有效

来自分类Dev

从另一个包导入python模块

来自分类Dev

Python导入模块在另一个文件中

来自分类Dev

从另一个包导入python模块

来自分类Dev

Python将文件模块导入另一个

来自分类Dev

将所有变量从另一个模块导入字典python

来自分类Dev

如何从另一个目录导入具有相对路径的 Python 模块?

来自分类Dev

python Tkinter:如何在调用在不同线程中运行的另一个函数之前加载带有“正在进行的工作”的状态栏

来自分类Dev

Python Monkey修补了一个由另一个模块执行的模块

来自分类Dev

从Python的另一个类内部调用方法

Related 相关文章

  1. 1

    如何从另一个具有主函数的python模块调用单个方法

  2. 2

    在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

  3. 3

    问题 - IE 上的 Ajax 调用仅在浏览器中打开具有相同 Ajax 调用的另一个页面时才有效

  4. 4

    JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

  5. 5

    在Python中将列表的每个元素与另一个列表的每个元素相乘/相加/分隔的有效方法

  6. 6

    这两个简单的python代码有什么不同?(一个有效,另一个无效)

  7. 7

    Groovy 元编程 (getProperty) 仅在从类外部调用时才有效?

  8. 8

    为什么将文本写入文件仅在从终端调用时才有效?

  9. 9

    在另一个函数中调用时未定义函数(Python)

  10. 10

    如何从Colab中的另一个python模块调用自定义模块

  11. 11

    如何通过另一个数据框的值在python / pandas中以最有效的方式标记一个数据框的列?

  12. 12

    Python多重处理:从具有传递变量的另一个脚本中进行多重处理的调用模块

  13. 13

    Python-如何在另一个模块中调用一个模块的主要功能?

  14. 14

    Python多线程使用另一个线程中的一个线程的数据

  15. 15

    是否可以强制某个浮点数的指数或有效位数与另一个浮点数匹配(Python)?

  16. 16

    如果Python不支持方法重载,那么为什么此方法重载有效而另一个不起作用?

  17. 17

    如何有效地将字典中的字符串列表与Python中的另一个字典列表进行比较?

  18. 18

    通过从另一个列表执行查找来替换元组列表中元素的有效方法(python)

  19. 19

    从另一个线程关闭Python BasicHTTPServer

  20. 20

    Python argparse可选参数仅在正确位置输入时才有效

  21. 21

    从另一个包导入python模块

  22. 22

    Python导入模块在另一个文件中

  23. 23

    从另一个包导入python模块

  24. 24

    Python将文件模块导入另一个

  25. 25

    将所有变量从另一个模块导入字典python

  26. 26

    如何从另一个目录导入具有相对路径的 Python 模块?

  27. 27

    python Tkinter:如何在调用在不同线程中运行的另一个函数之前加载带有“正在进行的工作”的状态栏

  28. 28

    Python Monkey修补了一个由另一个模块执行的模块

  29. 29

    从Python的另一个类内部调用方法

热门标签

归档