python - 尝试制作一个根据声音改变颜色的红绿灯(响亮的声音=红色,正常的声音=绿色等)
问题描述
我一直在尝试制作一个 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
def change_color(self):
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")
change_color(self)
root.after(500, change_color(self))
#root.after(500, TrafficLights)
root.mainloop()
while True:
decide_colour()
TrafficLights()
但它陷入了一个循环。并且通过摆脱while
声明,它只会打开一次。但我希望它继续运行,我希望它改变红绿灯的颜色。我已经尝试了几天,寻找答案。但我现在真的被困住了。
解决方案
问题似乎与您的程序的组织有关。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()
推荐阅读
- reactjs - React 应用程序突然空白页 - 哑剧问题?
- python - 刮擦组合框
- python - 在 Python 中查找列表元素的索引
- wix - 为什么不能通过 GPO 安装多语言 MSI?
- google-chrome - 静音音频自动播放在 Chrome 中不起作用
- ajax - 创建功能不起作用。数据表和 Ajax
- flutter - Flutter ListView.builder 中的不可重复标头
- python - 使用 twitter api 上传视频文件
- elasticsearch - 添加我自己的表发现 Tab Elasticsearch
- c - C编程中关于负数乘法的问题(不同数据类型)