我正在尝试在我的跨平台 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()