为了账号安全,请及时绑定邮箱和手机立即绑定

尝试制作根据声音改变颜色的红绿灯(响亮的声音 = 红色,正常声音 = 绿色等)

尝试制作根据声音改变颜色的红绿灯(响亮的声音 = 红色,正常声音 = 绿色等)

www说 2021-10-26 15:32:41
我一直在尝试制作一个 Tkinter 应用程序,它可以作为所产生声音的反馈信号灯。例如,当图书馆里的声音越来越大时,您会看到红灯,但是当它正常时,则是绿灯,依此类推。基本上,我已经创建了一个带有画布的 Tkinter 应用程序,并在矩形(红绿灯)中制作了 3 个圆圈,还制作了一个功能来从您的麦克风获取输入以查看声音的高低。此代码在单独的文件中制作以获取输入声音:def decide_colour():    def print_sound(indata, outdata, frames,tijd, status):        global colour        volume_norm = np.linalg.norm(indata)        print(volume_norm)        time.sleep(1)        #set fill colour        if volume_norm > 2 and volume_norm <4:            colour = "yellow"        elif volume_norm > 4:            colour = "red"        else:            colour = "green"        print(colour)    with sd.Stream(callback=print_sound):        sd.sleep(duration * 1000)decide_colour()这是应该显示它的 tkinter 应用程序:class TrafficLights:    def __init__(self):        root = Tk()        root.title("Stoplicht")        root.configure(bg='black')        root.geometry('460x400')        # Frame voor widgets        frame = Frame(root)        frame.grid()        self.colour = StringVar()        # canvas voor lichten        self.canvas = Canvas(root, width=460, height=400, bg="black")        self.canvas.create_rectangle(190, 10, 310, 350, outline='white', fill='black')        self.canvas.grid()        self.oval_red = self.canvas.create_oval(200, 20, 300, 120, fill="white")        self.oval_yellow = self.canvas.create_oval(200, 130, 300, 230, fill="white")        self.oval_green = self.canvas.create_oval(200, 240, 300, 340, fill="white")        # kleurbepaling voor de cirkels但它陷入了一个循环。并且通过摆脱while声明,它只会打开一次。但我希望它继续运行,我希望它改变红绿灯的颜色。我已经尝试了几天,寻找答案。但我现在真的被困住了。
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

问题似乎与您的程序的组织有关。while不需要那个循环。我做了一个简单的例子,说明如何after工作。在after循环中调用的函数应该从decide_colour()函数中获取它需要的数据。在这个例子中,它将是my_count().


from tkinter import *


class Counter(Frame):


    def __init__(self, master=None):

        self.count = 0

        super().__init__(master)

        self.grid()

        self.__create_widgets()


    def __create_widgets(self):

        self.count_label         = Label(self)

        self.count_label["text"] = str(self.count)

        self.count_label["pady"] = 5

        self.count_label.grid()



    def my_count(self):

        self.count = self.count+1

        self.count_label["text"] = str(self.count)



root = Tk()

counter = Counter(master=root)


#do you app set up here

root.title("Counter")

root.geometry('460x400')


def do_one_iteration():

    counter.my_count()

    root.after(500, do_one_iteration)

do_one_iteration()


counter.mainloop()


查看完整回答
反对 回复 2021-10-26
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

好吧,这不是我想要的答案,但它仍然是一个答案


我把代码放在一起,经过一些调整,我来到了这个。


from tkinter import *

import sounddevice as sd

import numpy as np

import time


duration = 1  #



def decide_colour():

    def print_sound(indata, outdata, frames, tijd, status):

        global colour

        volume_norm = np.linalg.norm(indata)

        time.sleep(1)


        # set fill colour

        if 2 < volume_norm < 4:

            colour = "yellow"

        elif volume_norm > 4:

            colour = "red"

        else:

            colour = "green"


        print(volume_norm, colour)


    with sd.Stream(callback=print_sound):

        sd.sleep(duration * 1000)



class TrafficLights:


    def __init__(self):


        root = Tk()

        root.title("Stoplicht")

        root.configure(bg='black')

        root.geometry('460x400')


        # Frame voor widgets

        frame = Frame(root)

        frame.grid()


        self.colour = StringVar()


        # canvas voor lichten

        self.canvas = Canvas(root, width=460, height=400, bg="black")

        self.canvas.create_rectangle(190, 10, 310, 350, outline='white', fill='black')

        self.canvas.grid()


        self.oval_red = self.canvas.create_oval(200, 20, 300, 120, fill="red")

        self.oval_yellow = self.canvas.create_oval(200, 130, 300, 230, fill="white")

        self.oval_green = self.canvas.create_oval(200, 240, 300, 340, fill="white")


    def create_frame():

        decide_colour()


        if colour == 'red':

            self.canvas.itemconfig(self.oval_red, fill="red")

            self.canvas.itemconfig(self.oval_yellow, fill="white")

            self.canvas.itemconfig(self.oval_green, fill="white")

        elif colour == 'yellow':

            self.canvas.itemconfig(self.oval_red, fill="white")

            self.canvas.itemconfig(self.oval_yellow, fill="yellow")

            self.canvas.itemconfig(self.oval_green, fill="white")

        elif colour == 'green':

            self.canvas.itemconfig(self.oval_red, fill="white")

            self.canvas.itemconfig(self.oval_yellow, fill="white")

            self.canvas.itemconfig(self.oval_green, fill="green")


        create_frame()


        root.update()

        time.sleep(1)

        root.destroy()

        return



while True:

    TrafficLights()

所以现在它在一秒钟后打开一个新的主循环并破坏之前的主循环。我实际上希望它在一个主循环中更新,但不知道如何更新,所以如果有人知道请告诉我


查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信