So for some reason the scale function in tkinter doesn't want to output the number on the scale. All i receive is either 0.0 or nothing. It seems to be to do with the GUI and calling functions through the GUI. Written and run in 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()
I have tried the functions settings
and saveSettings
on their own and they work fine, but when i call it through the GUI it doesn't seem to work.
Any ideas on the problem, my only solution would be have the settings
function and saveSettings
function in a different file and then run that file externally with os.startfile("etc...")
Minimal fix: change this
to this:
Because you have two root applications (
root
andsGui
are both instances ofTk
) the implied parent widget foritervar
is the first one created, beingroot
so tkinter gets confused when you specify it as the variable for a completely different application.But I would highly recommend using a
Toplevel
instance to keep the windows a part of the same program:although if you want to be able to run the setting window without the main one you might consider making all your visible windows
Toplevel
s and make the actual root hidden:Then make
root = Toplevel(abs_root)
You coud phase out the variable all together by using
.get
ing the scale directly: