当循环之间的值增加 1 时,如何播放声音?标识增量为 1 的代码是啥样的?

Posted

技术标签:

【中文标题】当循环之间的值增加 1 时,如何播放声音?标识增量为 1 的代码是啥样的?【英文标题】:How to play a sound when a value increases by 1 between loops? What does the code look like that identifies the increment by 1?当循环之间的值增加 1 时,如何播放声音?标识增量为 1 的代码是什么样的? 【发布时间】:2018-01-23 11:05:33 【问题描述】:

我使用 Python 3 设计并创建了一个程序,它可以读取我的 Gmail 收件箱中两个标签下的未读邮件。

通过使用 tkinter,我有两个可爱的框,显示每个标签中的总消息。一种用于销售一种特定产品,另一种用于销售另一种产品。

他们使用 update 循环每隔几秒钟重新检查每个标签。 然后在工作日之后,我使用 Gmail 中的清理脚本刷新收件箱的两个标签。

该程序适用于我团队的销售场所。他们可以每天查看销售数量,并实时了解某些营销活动的成功情况。它为士气创造了奇迹。

现在我想在销售额上升时实现一些声音。陈词滥调的铃响,也许是“chhaaaching”,你懂的。

因此,我目前正在处理我有限的知识,并在整个 *** 和其他网站上搜索了答案。我的猜测是我需要类似下面的东西......

“如果整数值在下一个循环中从它的前一个值改变,增量为 1 播放 soundA,或者,如果该值减少 1,则播放 soundB。”

我一生都无法弄清楚“增加 1”的术语是什么,我也不知道如何将声音附加到正在进行的循环中对整数所做的任何更改。救命!!

如果我不够清楚,我很乐意解释并进一步深入。

非常感谢你们。

这是我目前的代码...

#! /usr/bin/python3

import imaplib
import email
import tkinter as tk 

WIDTH = 1000
HEIGHT = 100


def update():
    mail=imaplib.IMAP4_SSL('imap.gmail.com',993)
    mail.login('email@gmail.com','MyPassword')
    mail.select("Submissions")
    typ, messageIDs = mail.search(None, "UNSEEN")
    FirstDataSetSUBS = str(messageIDs[0], encoding='utf8')
    if FirstDataSetSUBS == '':
        info1['text'] = 'no submissions'
    else:
        SecondDataSetSUBS = FirstDataSetSUBS.split(" ")
        nosubs = len(SecondDataSetSUBS)
        nosubs = int(nosubs)
        info1['text'] = ' submission[s]'.format(nosubs)
    subs.after(1000, update)

def update_2():
    mail=imaplib.IMAP4_SSL('imap.gmail.com',993)
    mail.login('email@gmail.com','MyPassword')
    mail.select("Memberships")
    typ, messageIDs = mail.search(None, "UNSEEN")
    FirstDataSetMSGS = str(messageIDs[0], encoding='utf8')
    if FirstDataSetMSGS == '':
        info2['text'] = 'no memberships'
    else:
        SecondDataSetMSGS = FirstDataSetMSGS.split(" ")
        memberships = len(SecondDataSetMSGS)
        memberships = int(memberships)
        info2['text'] = ' membership[s]'.format(memberships)
    membs.after(1000, update_2)

membs = tk.Tk()
subs = tk.Tk()

membs.title('memberships counter')
membs.configure(background="black")
subs.title('submissions counter')
subs.configure(background="black")

x = (subs.winfo_screenwidth()//5) - (WIDTH//5)
y = (subs.winfo_screenheight()//5) - (HEIGHT//5)
subs.geometry('x++'.format(WIDTH, HEIGHT, x, y))

info1 = tk.Label(subs, text='nothing to display', bg="black", fg="green", font="Lucida_Console 40")
info1.pack()

x = (membs.winfo_screenwidth()//2) - (WIDTH//2)
y = (membs.winfo_screenheight()//2) - (HEIGHT//2)
membs.geometry('x++'.format(WIDTH, HEIGHT, x, y))

info2 = tk.Label(membs, text='nothing to display', bg="black", fg="red", font="Lucida_Console 40")
info2.pack()

update()
update_2()
membs.mainloop
subs.mainloop()

【问题讨论】:

请缩小您的问题范围。很抱歉,我们不需要这个计划如何影响销售部门的故事。使用minimal reproducible example 指南为您所要求的内容创建特定代码。 对不起 Nae,我实际上注意到当人们了解一些上下文时会有更好的反应。但我当然会遵守未来的规则。 :) 【参考方案1】:

要播放音频,您可以使用pyaudio 模块

在 ubuntu 中,由 pip3 install pyaudio 安装,如果需要,包括 sudo

import pygame
pygame.init()

increased=0 

inc_music=pygame.mixer.music
dec_music=pygame.mixer.music
inc_music.load("/home/pratik/Documents/pos.wav")
dec_music.load("/home/pratik/Documents/neg.wav")

def get_inc():
   global increased
   a=increased
   return a

def pl():
 global inc_music
 global dec_music
 while True:
  increased=get_inc()
  if increased == 1:
    inc_music.play()
    increased=increased-1
  elif increased == -1:
    dec_music.play()
    increased=increased+1

这里increased 是一个全局变量。确保每当您的销售额增加时,它被设置为 +1,每当它减少时,它被设置为 -1,并在后台使用 threading 库在单独的线程中调用 pl 函数。因为,它是一个永远的循环,它将在后台持续运行并敲响钟声。

from threading import Thread

th=Thread(target=pl)
th.setDaemon(True)
th.start()

在撰写上述内容时,我假设销售量要么增加要么减少,两者不会同时发生。如果是这样,请使用另一个全局变量 decreased,它也使用 0 进行初始化,并且每次销售额减少时减少 -1。并从get_inc() 返回他们两个。

【讨论】:

感谢您提供此 Pratik。但是,我不确定我的“nosubs”和“memberships”整数值如何适合您的代码。我如何将它们链接到这个?你是说在你的代码中,你的全局变量被这些替换了吗?如果是这样,我的代码在嵌入的情况下实际上看起来如何?另外,您添加的线程部分将定位在哪里?对不起,我在这里完全是菜鸟。再次感谢,我希望这不是太麻烦。 @Smokeyparkin 假设您单独拥有 check_increased() 函数,这使得全局 integer 变量 increased 如果销售额增加则为 +1,如果销售额减少则为 -1销售量。在 tkinter 小部件的 mainloop 之前定位和启动线程,可能就在您的代码中的 update_2() 之后 很酷,但是 Global 是如何链接到上面的代码中的呢?这只是简单的自动操作,我只是将您的代码粘贴在我的小部件和 update_2() 之间吗?对不起,如果我在这里完全不听话。只是想确保我理解正确。 @Smokeyparkin 以上代码仅供参考,努力表达我对您问题的想法。简单的复制粘贴可能不起作用,您必须对其进行自定义以适合您的代码。我建议您对如何在 python 中使用全局变量进行一些研究,因为谈论它超出了这个问题的范围。 this may help【参考方案2】:

下面的代码生成一个label,它会更新randomly,并根据更改播放位于"C:\Windows\Media\"的声音文件:

import tkinter as tk
import random
from playsound import playsound


def sound(is_positive=True):
    if is_positive:
        playsound(r"C:\Windows\Media\chimes.wav", False)
    else:
        playsound(r"C:\Windows\Media\chord.wav", False)


def random_update():
    _old = label['text']
    _new = random.randint(1, 100)

    if _new > _old:     # use (_new - _old) == 1 for checking
        sound()         # increment of 1 exclusively
    elif _new < _old:   # use (_new - _old) == -1 for checking
        sound(False)    # decrement of 1 exclusively

    label['text'] = _new
    label.after(2000, random_update)


if __name__ == '__main__':
    root = tk.Tk()
    label = tk.Label(root, text=1)

    label.after(2000, random_update)
    label.pack()
    root.mainloop()

playsound 不是内置包,需要单独安装。您可以使用以下方式安装:

pip install playsound

或:

python -m pip install playsound

在 Windows 的命令提示符中。

【讨论】:

以上是关于当循环之间的值增加 1 时,如何播放声音?标识增量为 1 的代码是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

当另一个声音使用 XNA/XACT 结束时,如何立即播放一个声音?

如何延迟 For 循环直到声音在 Swift 中播放完毕

如何在我的应用程序中添加静音按钮?

如何在播放/暂停控制功能中停止无限循环

Android声音播放延迟到while循环结束

windows phone 7中的循环声音