2015-05-07 2 views
3

я следующий код в моей программе:PlaySound() замедляет процесс

self["text"]="✖"    
self["bg"]="red"    
self["relief"] = SUNKEN 
self.banged = True 
self.lost = True 
self.lettersLeft = 0 
self.lettersBanged = self.lettB 
winsound.PlaySound('sound.wav', winsound.SND_FILENAME) 
messagebox.showerror("Letter Banging","Sorry, you lost the game!", parent=self) 
for key in self.squares.keys(): 
    if self.squares[key].value == 3: 
     self.squares[key].banged = False 
     self.squares[key].expose() 

Я только добавил winsound.PlaySound('sound.wav', winsound.SND_FILENAME) части, и она замедлилась своей программой. Infact, он сначала воспроизводит звук, а затем делает то, что перед ним. Я использую Python с tKinter. Какие-либо предложения?

+0

Пробовали ли вы с помощью несколько процесса? –

+1

Прошу прощения за неправильную фразу. Я имею в виду многопоточность. Вы можете попробовать это http://www.tutorialspoint.com/python/python_multithreading.htm Надеюсь, это поможет. В вашем случае попробуйте использовать другой поток для воспроизведения звука. –

+0

Определение можно легко найти по интернету или по приведенной выше ссылке. Но идея Вы разделите 'winsound.PlaySound ('sound.wav', winsound.SND_FILENAME)' на другую функцию, назовем 'soundsound()'. Чтобы создать поток и запустить его, вы можете использовать 'thread.start_new_thread (soundsound,())', чтобы вызвать функцию playound. Не забудьте импортировать библиотеку 'thread' –

ответ

1

Когда вы изменяете свойство виджета, такое как редактирование контента, фона и рельефа, это изменение не появляется сразу, они записываются и вступают в силу только тогда, когда вы передаете руку mainloop, которые вызывают перерисовку вашего приложения , Это приводит к поведению, которое вы наблюдаете: звук воспроизводится, затем завершается обратный вызов и происходит перерисовка, показывающая ваше изменение.

Все время, которое вы потратите на обратный вызов, воспроизводящий звук, ваше приложение не будет реагировать. Если вы оцениваете, что ваш звук достаточно короткий, вы можете добавить self.update() где-то между изменением пользовательского интерфейса, которое вы хотите показать первым, и вызовом PlaySound.

Если вы хотите, чтобы избежать какой-либо невосприимчивости в вашем приложении, вы можете воспроизводить звук в другом потоке

sound_thread = threading.Thread(target=lambda:winsound.PlaySound('sound.wav', winsound.SND_FILENAME)) 
sound_thread.start() 
Смежные вопросы