2016-04-18 8 views
0

Aus irgendeinem Grund möchte die Skalierungsfunktion in tkinter die Zahl nicht auf der Skala ausgeben. Alles, was ich erhalte, ist entweder 0.0 oder nichts. Es scheint, mit der GUI zu tun und Funktionen über die GUI aufzurufen. Geschrieben und in Python ausgeführt 3.4.Skalierungsfunktion gibt Nummer nicht an Variable aus?

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() 

Ich habe die Funktionen settings und saveSettings versucht, auf eigene Faust, und sie arbeiten gut, aber wenn ich es über die GUI aufrufen scheint es nicht zu funktionieren.

Irgendwelche Ideen auf, das Problem, wäre meine einzige Lösung, um die settings Funktion und saveSettings Funktion in einer anderen Datei und diese Datei dann extern mit os.startfile("etc...")

+0

warum nennst du 'sGui.mainloop()' in der 'Einstellungen' Funktion? –

+0

, damit das Einstellungsfenster beim Ausführen geöffnet bleibt?!?! –

+1

.... oh es ist eine andere 'Tk' Instanz ... ok Sie müssen es in ein' Toplevel' ändern, damit es als ein anderes Fenster zum Hauptprogramm existiert. –

Antwort

3

Minimal fix laufen haben werden: das ändern

itervar = DoubleVar() 

zu diesem:

itervar = DoubleVar(sGui) 

Weil Sie zwei Wurzelanwendungen haben (root und sGui sind beide Instanzen von Tk) das implizierte übergeordnete Widget für itervar ist das erste erstellt, root so tkinter wird verwirrt, wenn Sie es als die Variable für eine völlig andere Anwendung angeben.

Aber ich würde sehr empfiehlt eine Toplevel Instanz mit dem Fenster einen Teil des gleichen Programms zu halten:

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

obwohl, wenn Sie das Einstellungsfenster ohne die Haupt der Lage sein, laufen man Sie könnte prüfen, alle sichtbaren Fenster Toplevel s machen und machen die eigentliche Wurzel versteckt:

   # 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 

Dann 012 machen


Sie coud alle zusammen die Variable Ausstieg aus der von .get mit direkt auf die Waage ing:

iterations = iterscale.get()