我正在尝试向我的跨平台 pyQt 程序添加一个简单的节拍器,但是很难获得准确的计时。使用 PyGame 的声音系统播放声音似乎效果最好。我尝试了 Phonon,但它根本不一致,而且 QSound 在我的系统上根本不起作用。我已经尝试使用 python 的时间库和 QTimers 处理计时,但 QTimeLine 似乎效果最好。
低节奏的时机还不错……这里和那里仍然是一个小问题。然而,更高的节奏根本不准确。
任何想法/建议将不胜感激!
这是一些代码:
class Metronome(object):
def init_metronome(self):
self.metronome_timer = QtCore.QTimeLine(100000)
self.metronome_timer.valueChanged.connect(self.tick)
self.metronome_timer.setCurveShape(3) #linear curve
self.ui.pushButton_metronome.toggled.connect(self.toggle_metronome)
self.ui.spinBox_metronome_bpm.valueChanged.connect(self.set_metronome_bpm)
pygame.mixer.init()
self.sound = pygame.mixer.Sound("./sounds/tick.wav")
def toggle_metronome(self):
if self.ui.pushButton_metronome.isChecked() == True:
self.set_metronome_bpm()
self.metronome_timer.start()
else:
self.metronome_timer.stop()
def set_metronome_bpm(self):
bpm = self.ui.spinBox_metronome_bpm.value()
self.metronome_timer.setUpdateInterval(60./bpm * 1000)
def tick(self):
QtCore.QCoreApplication.processEvents()
self.sound.play()
Run Code Online (Sandbox Code Playgroud)