我想知道是否有可能动态地改变一个比例的最大值与另一个比例与tkinter。
我有一个有两个刻度的例子,其中第一个刻度是sc_maxVal
,变量maxVal
是第二个刻度的最大值。
我能够在第一个地方设置它,但我不知道如何改变sc_var
的to
参数,而脚本正在与sc_max
运行。
import tkinter as tk
mainApp = tk.Tk()
mainApp.title("Windows")
mainApp.geometry("800x600")
maxVal = tk.DoubleVar()
maxVal.set(20)
var = tk.DoubleVar()
var.set(int(maxVal.get()/2))
sc_max = tk.Scale(mainApp, label= 'maxVal', from_= 10, to= 40, orient= tk.HORIZONTAL, length= 500, variable= maxVal).pack()
sc_var = tk.Scale(mainApp, label= 'var', from_= 1, to= int(maxVal.get()), orient= tk.HORIZONTAL, length= 500, variable= var).pack()
mainApp.mainloop()
你可以配置一个刻度,当它的值改变时调用一个函数。在该函数中,您可以使用configure
方法来配置其他刻度。
在创建小部件的同一语句中调用pack
也会犯一个非常常见的错误。您需要将它们分开,否则您要分配的变量将被设置为None
,因为.pack(...)
返回None
。
注意:command
被作为参数传递新值。
def update_scale(new_max):
sc_var.configure(to=new_max)
sc_var = tk.Scale(...)
sc_max = tk.Scale(..., command=update_scale)
sc_var.pack()
sc_max.pack()
您可能想要创建一个while循环并在此期间更新mainApp
。然后,你可以在应用程序运行期间更改小部件的属性,而不必让它被事件或其他东西触发。例如,使用:
while True:
try:
mainApp.update()
if you_want_to_change_the_to_value:
sc_var.config(to=your_value)
except tkinter.TclError:
break
代替
mainApp.mainloop()
我在Sylvester Kruin的帮助下找到了解决办法。
主循环必须被替换成这样的东西
while True:
mainApp.update()
if you_want_to_change_the_to_value:
sc_var.config(to=your_value)
我还发现我们必须将sc_var.pack()放入循环中。它给出了脚本
import tkinter as tk
mainApp = tk.Tk()
mainApp.title("Windows")
mainApp.geometry("800x600")
maxVal = tk.DoubleVar()
maxVal.set(40)
changement = int(maxVal.get())
var = tk.DoubleVar()
var.set(int(maxVal.get()/2))
sc_max = tk.Scale(mainApp, label= 'maxVal', from_= 10, to= 40, orient= tk.HORIZONTAL, length= 500, variable= maxVal).pack()
sc_var = tk.Scale(mainApp, label= 'var', from_= 1, to= int(maxVal.get()), orient= tk.HORIZONTAL, length= 500, variable= var)
while True:
sc_var.pack()
mainApp.update()
sc_var.config(to=int(maxVal.get()))