Как я и обещал вчера, вот настоящий код.
Я собираюсь написать программу для определения времени реверберации в комнате. Объяснение всего проекта занимает слишком много времени. Я попробовал подход, который был предложен, но я делаю что-то не так ...
В PageOne есть все степени поглощения материалов на разных звуковых частотах и в PageTwo , пользователь должен ввести площадь в квадратных метрах и выбрать материал. Как только кнопка OK нажата, функции getBottomChoice и getWallChoice умножают значения материалов в PageOne на ввод пользователя, чтобы получить область поглощения. Но, к сожалению, это не работает. И как я могу распечатать новые значения (площадь поглощения) выбранных материалов, только для проверки? И последнее, но не менее важное: как я могу подвести итоги по выбранным материалам и распечатать их по частотам? Заранее спасибо!
import tkinter as tk
from tkinter import ttk
from tkinter import *
import math
LARGE_FONT = ("Verdana", 12)
class ReverberationTime(tk.Tk):
def __init__(self,*args,**kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "reverberation time")
tk.Tk.iconbitmap(self,"C:/Users/PC/Desktop/Icons/speaker.ico")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo, PageThree):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self,cont):
frame = self.frames[cont]
frame.tkraise()
class Pages:
p = 0
z = 1
abs_flä = 1
def __init__(self):
self.parkett_125 = 0.04
self.parkett_250 = 0.04
self.parkett_500 = 0.05
self.parkett_1000 = 0.06
self.parkett_2000 = 0.06
self.parkett_4000 = 0.06
self.linoleum_125 = 0.02
self.linoleum_250 = 0.02
self.linoleum_500 = 0.03
self.linoleum_1000 = 0.03
self.linoleum_2000 = 0.04
self.linoleum_4000 = 0.04
self.pvc_125 = 0.02
self.pvc_250 = 0.02
self.pvc_500 = 0.01
self.pvc_1000 = 0.03
self.pvc_2000 = 0.05
self.pvc_4000 = 0.05
self.tapete_125 = 0.02
self.tapete_250 = 0.03
self.tapete_500 = 0.04
self.tapete_1000 = 0.05
self.tapete_2000 = 0.07
self.tapete_4000 = 0.08
self.glattputz_125 = 0.02
self.glattputz_250 = 0.02
self.glattputz_500 = 0.03
self.glattputz_1000 = 0.03
self.glattputz_2000 = 0.04
self.glattputz_4000 = 0.06
self.mauerziegelwand_125 = 0.02
self.mauerziegelwand_250 = 0.02
self.mauerziegelwand_500 = 0.03
self.mauerziegelwand_1000 = 0.04
self.mauerziegelwand_2000 = 0.05
self.mauerziegelwand_4000 = 0.06
def bottoms(self,parkett_125,parkett_250,parkett_500,parkett_1000,
parkett_2000,parkett_4000,linoleum_125,linoleum_250,linoleum_500,
linoleum_1000,linoleum_2000,linoleum_4000,pvc_125,
pvc_250,pvc_500,pvc_1000,pvc_2000,pvc_4000):
self.parkett_125 = parkett_125
self.parkett_250 = parkett_250
self.parkett_500 = parkett_500
self.parkett_1000 = parkett_1000
self.parkett_2000 = parkett_2000
self.parkett_4000 = parkett_4000
self.linoleum_125 = linoleum_125
self.linoleum_250 = linoleum_250
self.linoleum_500 = linoleum_500
self.linoleum_1000 = linoleum_1000
self.linoleum_2000 = linoleum_2000
self.linoleum_4000 = linoleum_4000
self.pvc_125 = pvc_125
self.pvc_250 = pvc_250
self.pvc_500 = pvc_500
self.pvc_1000 = pvc_1000
self.pvc_2000 = pvc_2000
self.pvc_4000 = pvc_4000
def walls(self,tapete_125,tapete_250,tapete_500,tapete_1000,tapete_2000,tapete_4000,
glattputz_125,glattputz_250,glattputz_500,glattputz_1000,glattputz_2000,glattputz_4000,
mauerziegelwand_125,mauerziegelwand_250,mauerziegelwand_500,mauerziegelwand_1000,mauerziegelwand_2000,mauerziegelwand_4000):
self.tapete_125 = tapete_125
self.tapete_250 = tapete_250
self.tapete_500 = tapete_500
self.tapete_1000 = tapete_1000
self.tapete_2000 = tapete_2000
self.tapete_4000 = tapete_4000
self.glattputz_125 = glattputz_125
self.glattputz_250 = glattputz_250
self.glattputz_500 = glattputz_500
self.glattputz_1000 = glattputz_1000
self.glattputz_2000 = glattputz_2000
self.glattputz_4000 = glattputz_4000
self.mauerziegelwand_125 = mauerziegelwand_125
self.mauerziegelwand_250 = mauerziegelwand_250
self.mauerziegelwand_500 = mauerziegelwand_500
self.mauerziegelwand_1000 = mauerziegelwand_1000
self.mauerziegelwand_2000 = mauerziegelwand_2000
self.mauerziegelwand_4000 = mauerziegelwand_4000
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="reverberation time", font=LARGE_FONT)
label.pack(pady = 10, padx = 10)
button = ttk.Button(self, text="welcome!",
command=lambda: controller.show_frame(PageOne)).pack()
class PageOne(tk.Frame, Pages):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
NORMAL_FONT=("Arial",11)
title = tk.Label(self, text="Please enter the room dimensions.", font=LARGE_FONT)
title.pack(pady = 10, padx = 10)
frame = Frame(self)
frame.pack(pady=20)
self.lenght = StringVar()
self.width = StringVar()
self.height = StringVar()
self.v = StringVar()
dimensions = Frame(frame)
dimensions.pack(side='left', pady=5)
entryfields = Frame(frame)
entryfields.pack(side='right', pady=5)
lblLenght = Label(dimensions, text="lenght:", font=NORMAL_FONT)
lblLenght.pack(pady=3)
lblWidth = Label(dimensions, text="width:", font=NORMAL_FONT)
lblWidth.pack(pady=4)
lblHeight = Label(dimensions, text="height:", font=NORMAL_FONT)
lblHeight.pack(pady=4)
lblVolume = Label(dimensions, textvariable = self.v)
lblVolume.pack()
entLength = Entry(entryfields, textvariable = self.lenght)
entLength.pack(pady=6)
entWidth = Entry(entryfields, textvariable = self.width)
entWidth.pack(pady=6)
entHeight = Entry(entryfields, textvariable = self.height)
entHeight.pack(pady=6)
btncalculate = ttk.Button(self, text="calculate")
btncalculate.pack()
btncalculate.bind("<Button-1>", self.calculate)
btnPageTwo = ttk.Button(self, text="Page 2", command=lambda: controller.show_frame(PageTwo))
btnPageTwo.pack()
btnStartPage = ttk.Button(self, text="Start Page", command=lambda: controller.show_frame(StartPage))
btnStartPage.pack()
def calculate(self, carryout):
try:
l = float(self.lenght.get())
b = float(self.width.get())
h = float(self.height.get())
m = l*b*h
self.v.set("volume: % .2f m³" % m)
Pages.p = m
except ValueError:
tk.messagebox.showinfo('No valid input.','Please enter only numbers!',icon = 'warning')
class PageTwo(tk.Frame, Pages):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
NORMAL_FONT=("Arial",11)
title = tk.Label(self, text="Please select the bottom abilities.", font=LARGE_FONT)
title.pack(pady = 10, padx = 10)
self.bottomMaterial =StringVar()
self.bottom = StringVar()
self.wallMaterial =StringVar()
self.wall = StringVar()
frame = Frame(self)
frame.pack(pady=20)
dimensions = Frame(frame)
dimensions.pack(side='left', pady=5)
entBottom = Entry(dimensions, textvariable = self.bottom)
entBottom.grid(pady = 5)
self.cboBottomMaterial = ttk.Combobox(dimensions, textvariable = self.bottomMaterial, state = 'readonly',font = ('arial', 14, 'bold'), width = 19)
self.cboBottomMaterial ['value'] = ('Parkett', 'Linoleum', 'PVC')
self.cboBottomMaterial.current(0)
self.cboBottomMaterial.grid()
btnBottomChoice = ttk.Button(dimensions, text = "OK", command = self.getBottomChoice)
btnBottomChoice.grid()
entWall = Entry(dimensions, textvariable = self.wall)
entWall.grid(pady = 5)
self.cboWallMaterial = ttk.Combobox(dimensions, textvariable = self.wallMaterial, state = 'readonly',font = ('arial', 14, 'bold'), width = 19)
self.cboWallMaterial ['value'] = ('Tapete', 'Glattputz', 'Mauerziegelwand')
self.cboWallMaterial.current(0)
self.cboWallMaterial.grid()
btnWallChoice = ttk.Button(dimensions, text = "OK", command = self.getWallChoice)
btnWallChoice.grid()
btnsumAbsorptionArea = ttk.Button(self, text="sum")
btnsumAbsorptionArea.pack()
btnsumAbsorptionArea.bind("<Button-1>", self.sumAbsorptionArea)
btnPageTwo = ttk.Button(self, text="Page 1", command=lambda: controller.show_frame(PageOne))
btnPageTwo.pack()
btnStartPage = ttk.Button(self, text="Start Page", command=lambda: controller.show_frame(StartPage))
btnStartPage.pack()
btnStartPage = ttk.Button(self, text="Page 3", command=lambda: controller.show_frame(PageThree))
btnStartPage.pack()
def getBottomChoice(self):
if self.cboBottomMaterial.get() == "Parkett":
self.bottoms(
self.parkett_125 * float(self.bottom.get()),
self.parkett_250 * float(self.bottom.get()),
self.parkett_500 * float(self.bottom.get()),
self.parkett_1000 * float(self.bottom.get()),
self.parkett_2000 * float(self.bottom.get()),
self.parkett_4000 * float(self.bottom.get())
)
elif self.cboBottomMaterial.get() == "Linoleum":
self.bottoms(
self.linoleum_125 * float(self.bottom.get()),
self.linoleum_250 * float(self.bottom.get()),
self.linoleum_500 * float(self.bottom.get()),
self.linoleum_1000 * float(self.bottom.get()),
self.linoleum_2000 * float(self.bottom.get()),
self.linoleum_4000 * float(self.bottom.get())
)
elif self.cboBottomMaterial.get() == "PVC":
self.bottoms(
self.pvc_250 * float(self.bottom.get()),
self.pvc_500 * float(self.bottom.get()),
self.pvc_1000 * float(self.bottom.get()),
self.pvc_2000 * float(self.bottom.get()),
self.pvc_4000 * float(self.bottom.get())
)
elif self.cboBottomMaterial.get() == "":
messagebox.showinfo('No valid input.','Please select.',icon = 'warning')
def getWallChoice(self):
if self.cboWallMaterial.get() == "Tapete":
self.walls(
self.tapete_125 * float(self.wall.get()),
self.tapete_250 * float(self.wall.get()),
self.tapete_500 * float(self.wall.get()),
self.tapete_1000 * float(self.wall.get()),
self.tapete_2000 * float(self.wall.get()),
self.tapete_4000 * float(self.wall.get())
)
elif self.cboWallMaterial.get() == "Glattputz":
self.walls(
self.glattputz_125 * float(self.wall.get()),
self.glattputz_250 * float(self.wall.get()),
self.glattputz_500 * float(self.wall.get()),
self.glattputz_1000 * float(self.wall.get()),
self.glattputz_2000 * float(self.wall.get()),
self.glattputz_4000 * float(self.wall.get())
)
elif self.cboWallMaterial.get() == "Mauerziegelwand":
self.walls(
self.mauerziegelwand_250 * float(self.wall.get()),
self.mauerziegelwand_500 * float(self.wall.get()),
self.mauerziegelwand_1000 * float(self.wall.get()),
self.mauerziegelwand_2000 * float(self.wall.get()),
self.mauerziegelwand_4000 * float(self.wall.get())
)
elif self.cboWallMaterial.get() == "":
messagebox.showinfo('No valid input.','Please select.',icon = 'warning')
def sumAbsorptionArea(self,sum):
sum = self.getBottomChoice + self.getWallChoice
print (sum)
class PageThree(tk.Frame, Pages):
def passvariable(self, var):
self.s.set("volume: % .2f m³" % Pages.p)
def absorptionsrate(self, var):
self.abs_rate.set("volume: % .2f m³" % Pages.abs_flä)
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
frame = Frame(self)
frame.pack(pady=20)
result_var = StringVar()
selected_var = StringVar()
self.s = StringVar()
items_for_listbox = ["Musik","Sprache","Vortrag","Spr.+Vor.","Sport"]
self.abs_rate = StringVar()
def select(event):
a = mylistbox.get(ANCHOR)
Pages.z = curselection(a)
selected_var.set(Pages.z)
def curselection(a):
if a=="Musik":
T_soll_A1 = 0.45*math.log10(Pages.p)+0.07
return (T_soll_A1)
elif a=="Sprache":
T_soll_A2 = 0.37*math.log10(Pages.p)-0.14
return (T_soll_A2)
elif a=="Vortrag":
T_soll_A3 = 0.32*math.log10(Pages.p)-0.17
return (T_soll_A3)
elif a=="Spr.+Vor.":
T_soll_A4 = 0.26*math.log10(Pages.p)-0.14
return (T_soll_A4)
elif a=="Sport":
T_soll_A5 = 0.75*math.log10(Pages.p)-1
return (T_soll_A5)
def calc():
if mylistbox.get(ACTIVE):
Abs_Fl_ges = 0.163 * Pages.p / Pages.z
Absorber = Abs_Fl_ges - Pages.abs_flä
result_var.set(Absorber)
elif Pages.z == 0:
messagebox.showinfo("No selection")
self.dimension = Frame(frame)
self.dimension.pack(side='left', pady=5)
lblPageTwo = tk.Label(self, text="Page 2", font=LARGE_FONT)
lblPageTwo.pack(pady = 10, padx = 10)
lblAbs_rate = tk.Label(self.dimension, textvariable = self.abs_rate)
lblAbs_rate.pack()
pasvar = tk.Label(self.dimension, textvariable = self.s)
pasvar.pack()
lblselection = tk.Label(self.dimension, textvariable=selected_var)
lblselection.pack(expand=YES)
selected_var.set("No selection")
lblresult = Label(self.dimension, textvariable=result_var)
lblresult.pack(expand=YES)
result_var.set("No result")
listbox_frame = Frame(self.dimension)
listbox_frame.pack(expand=YES)
mylistbox = Listbox(listbox_frame, height=5, width=10, font=('times',18))
mylistbox.bind('<<ListboxSelect>>', select)
mylistbox.grid(row=0, column=0)
mylistbox.insert(END, *items_for_listbox)
scroll = Scrollbar(listbox_frame, orient=VERTICAL) # the alignment of the scrollbar
mylistbox["yscrollcommand"] = scroll.set # link the list with the scroll
scroll["command"] = mylistbox.yview # link the scroll with the scroll
scroll.grid(row=0, column=1, sticky=N+S) #sticky=N+S+E)
btnAbsorber=Button(self.dimension, text="Fläche der Absorber", command=calc)
btnAbsorber.pack(expand=YES)
btnStartPage = ttk.Button(self, text="Start Page", command=lambda: controller.show_frame(StartPage))
btnStartPage.pack()
btnPageOne = ttk.Button(self, text="Page 1", command=lambda: controller.show_frame(PageOne))
btnPageOne.pack()
btnPageTwo = ttk.Button(self, text="Page 2", command=lambda: controller.show_frame(PageTwo))
btnPageTwo.pack()
btnPassVariable = ttk.Button(self, text="pasvariable")
btnPassVariable.pack()
btnPassVariable.bind("<Button-1>", self.passvariable)
btnAbs_rate = ttk.Button(self, text="pass absorption rate")
btnAbs_rate.pack()
btnAbs_rate.bind("<Button-1>", self.absorptionsrate)
app = ReverberationTime()
app.mainloop() ```