Этот код решает проблему с запуском notes_comp
при перемещении Scale
, но не решает проблему сохранения суммы всех значений равной 1.
Во всех ситуациях вы должны использовать переменные, а не строки "var_1"
и "notes_comp"
variable=var_1, command=notes_comp
Для каждого Scale
я использую два DoubleVar
- current_var
и previous_var
, чтобы я мог сравнить, как это изменилось, и попытаться использовать разницу current_var - previous_var
для изменения других значений. Но это проблема, потому что я не могу добавить (current_var - previous_var)/2
к обоим, потому что один из них может иметь максимальное значение. Другая проблема заключается в том, что (current_var - previous_var)/2
может давать значение 0.05
, но Scale
имеет resolution=".1"
, поэтому не может отображать 0.05
, 0.15
, 0.25
и т.д. c. Если бы я изменил resolution=".05"
, то (current_var - previous_var)/2
дал бы значение 0.025
, а Scale
не отобразил бы 0.025
, 0.075
, 0.125
, et c.
Другая проблема делает (как обычно) float
значения, которые иногда дают результаты, отличные от ожидаемых - ie. 0.1 + 0.2 == 0.3
дает False
, но мы можем ожидать True
- потому что компьютер сохраняет только некоторые приблизительные значения.
from tkinter import *
# def notes_comp():
# summ = (float(silence_weight.get()))+(float(sustain_weight.get()))
# diff = 1 - (float(note_weight.get())+summ)
# if float(note1_weight.get())+summ != 1:
# silence_weight.set(silence_weight.get()+diff/2)
# sustain_weight.set(sustain_weight.get()+diff/2)
def notes_comp(value):
#
# this calculations doesn't work correctly
#
print('running notes_comp:')
# compare difference - minimal value `0.1`
diff = current_var_1.get() - previous_var_1.get()
# sometimes `half1` can be `0.0` and then `half2 has to be `0.1` instead of `0.05`
half1 = round(diff/2, 1)
half2 = round(diff-half1, 1)
#print(previous_var_1.get(), current_var_1.get(), half1, half2)
# use it to change other valus
current_var_2.set(current_var_2.get() - half1)
current_var_3.set(current_var_3.get() - half2)
# remember current value to use it next time
previous_var_1.set(current_var_1.get())
# tkinter GUI
root = Tk(className=" Rhythm Generator")
# setting color variables
bg_color = "#1c1c1c"
rollover_color = "#d9d9d9"
current_var_1 = DoubleVar()
current_var_2 = DoubleVar()
current_var_3 = DoubleVar()
previous_var_1 = DoubleVar()
previous_var_2 = DoubleVar()
previous_var_3 = DoubleVar()
root.configure(bg=bg_color)
# creating master frames
top_frame = Frame(root, bg=bg_color)
top_frame.grid(row="0")
# creating sliders
note1_weight = Scale(top_frame, from_="1", to="0", resolution=".1", variable=current_var_1, command=notes_comp)
note1_weight.grid(column="2", row="0")
silence_weight = Scale(top_frame, from_="1", to="0", resolution=".1", variable=current_var_2)
silence_weight.grid(column="3", row="0")
sustain_weight = Scale(top_frame, from_="1", to="0", resolution=".1", variable=current_var_3)
sustain_weight.grid(column="4", row="0")
# start values
current_var_1.set(.1)
previous_var_1.set(.1)
current_var_2.set(.1)
previous_var_2.set(.1)
current_var_3.set(.8)
previous_var_3.set(.8)
root.mainloop()