<p>这段代码解决了在移动<code>Scale</code>时运行<code>notes_comp</code>的一些问题,但它并不能解决所有值之和等于1的问题</p>
<p>在所有情况下都必须使用变量,而不是字符串<code>"var_1"</code>和<code>"notes_comp"</code></p>
<pre><code>variable=var_1, command=notes_comp
</code></pre>
<hr/>
<p>对于每个<code>Scale</code>,我使用两个<code>DoubleVar</code>-<code>current_var</code>和<code>previous_var</code>,这样我可以比较它是如何变化的,并尝试使用差异<code>current_var - previous_var</code>来改变其他值。但这是一个问题,因为我不能将<code>(current_var - previous_var)/2</code>添加到两者中,因为其中一个可能已经具有最大值。另一个问题是<code>(current_var - previous_var)/2</code>可能给出值<code>0.05</code>,但是<code>Scale</code>有<code>resolution=".1"</code>,所以它不能显示<code>0.05</code>、<code>0.15</code>、<code>0.25</code>等等。如果我改变<code>resolution=".05"</code>,那么<code>(current_var - previous_var)/2</code>将给出值<code>0.025</code>,<code>Scale</code>将不会播放<code>0.025</code>、<code>0.075</code>、<code>0.125</code>,等等</p>
<p>另一个问题是(通常情况下)<code>float</code>值,这些值有时给出不同的结果,然后我们可以期望-即<code>0.1 + 0.2 == 0.3</code>给出<code>False</code>,但我们可以期望<code>True</code>-因为计算机只保留一些近似值</p>
<pre><code>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()
</code></pre>