¿La función de escala no da salida a una variable?

Entonces, por alguna razón, la función de escala en tkinter no quiere mostrar el número en la escala. Todo lo que recibo es 0.0 o nada. Parece que tiene que ver con la GUI y las funciones de llamada a través de la GUI. Escrito y ejecutado en python 3.4.

from tkinter import * from tkinter import ttk from tkinter import messagebox iterations=30 def settings(): global itervar, iterscale sGui = Tk() itervar = DoubleVar() iterscale = Scale(sGui, orient="horizontal", from_=1, to=1000, variable=itervar) iterscale.pack() iterbutton = Button(sGui, text="Save Settings", command=saveSettings) iterbutton.pack() sGui.mainloop() def saveSettings(): global iterations iterations = itervar.get() print(iterations) def doNothing(): pass def main(): global root, version root= Tk() menu = Menu(root) root.config(menu=menu) fileMenu = Menu(menu) menu.add_cascade(label="File", menu=fileMenu) fileMenu.add_command(label="Quit", command=quit) benchmarkMenu = Menu(menu) menu.add_cascade(label="Benchmark", menu=benchmarkMenu) benchmarkMenu.add_command(label="Run [All]", command=doNothing) benchmarkMenu.add_separator() benchmarkMenu.add_command(label="Settings", command=settings) root.mainloop() #Main main() 

He probado la settings las funciones y los settings saveSettings por su cuenta y funcionan bien, pero cuando lo llamo a través de la GUI no parece funcionar.

Cualquier idea sobre el problema, mi única solución sería tener la función de settings y la función saveSettings en un archivo diferente y luego ejecutar ese archivo externamente con os.startfile("etc...")

Arreglo mínimo: cambia esto

 itervar = DoubleVar() 

a esto:

 itervar = DoubleVar(sGui) 

Debido a que tiene dos aplicaciones raíz (la root y sGui son instancias de Tk ), el widget primario implícito para itervar es el primero creado, siendo la root por lo que tkinter se confunde cuando lo especifica como la variable para una aplicación completamente diferente.

Pero recomendaría encarecidamente usar una instancia de Toplevel para mantener las ventanas como parte del mismo progtwig:

 sGui = Toplevel(root) ... #sGui.mainloop() #no longer need this 

aunque si desea poder ejecutar la ventana de configuración sin la ventana principal, podría considerar hacer que todas las ventanas visibles sean Toplevel y hacer que la raíz real esté oculta:

  # I'm not sure if you want to call it this abs_root = Tk() # but you are already using root abs_root.withdraw() #hide the window 

Luego haz root = Toplevel(abs_root)


Puede eliminar la variable por .get utilizando .get la escala directamente:

 iterations = iterscale.get()