2016-04-22 12 views
0

Ich schaue mich mit einer einfachen, derzeit hässlichen GUI an, die mit Tkinter erstellt wurde, um zwei Variablen vom Benutzer zu erhalten. Nämlich einen Dateipfad und eine Auswahl aus einem Dropdown (OptionMenu).Zurückgeben von Variablen von Tkinter GUI

Die ausgewählten Variablen werden später im Python-Skript verwendet, wo ich Schwierigkeiten habe. Vereinfacht gesagt, wie man die Benutzerauswahl den Variablen zuordnet: Träger, Pfad.

Bitte siehe unten für Beispielcode:

from Tkinter import * 
from tkFileDialog import askopenfilename 

def Choose_Path(): 
    Tk().withdraw() 
    return askopenfilename() 


root = Tk() 
root.geometry('400x400') 
root.configure(background='#A2B5CD') 

C_Label = Label(root, text='Carrier Choice:', bg='#A2B5CD', fg='black',font=('Calibri', 12)) 
C_Label.grid(row=0,sticky=W, padx =10) 
I_Label = Label(root, text='Invoice Path:', bg='#A2B5CD', fg='black',font=('Calibri', 12)) 
I_Label.grid(row=1, sticky=W, padx =10) 


var = StringVar(root) 
var.set('Choose Carrier...') 
option = OptionMenu(root, var, 'DHL','DPD','DX','Fedex','Geodis','Hermes','WN Direct') 
option.config(relief=RAISED, highlightbackground='#A2B5CD') 
option.grid(row=0,column=1, sticky=W, pady = 10) 

browser = Button(root, text = 'Browse Invoice...', command=Choose_Path) 
browser.grid(row=1, column=1, sticky=W, pady=10) 


Button(root, text='Accept and Close').grid(column=1, sticky=S) 

root.mainloop() 

Jedes Feedback geschätzt würde. Danke im Voraus.

Antwort

1

Durch eine Kombination aus Ihrem Feedback und etwas mehr Spiel mit einer zusätzlichen Funktion, scheint ich jetzt die Ergebnisse zu bekommen, die ich brauche. Sehen Sie unten, wie es jetzt aussieht.

from Tkinter import * 
from tkFileDialog import askopenfilename 
path = [] 

def Choose_Path(): 
    Tk().withdraw() 
    path.append(askopenfilename()) 

def CloseGUI(): 
    root.quit() 
    root.destroy() 

root = Tk() 
root.geometry('400x400') 
root.configure(background='#A2B5CD') 

C_Label = Label(root, text='Carrier Choice:', bg='#A2B5CD', fg='black',font=('Calibri', 12)) 
C_Label.grid(row=0,sticky=W, padx =10) 
I_Label = Label(root, text='Invoice Path:', bg='#A2B5CD', fg='black',font=('Calibri', 12)) 
I_Label.grid(row=1, sticky=W, padx =10) 

var = StringVar(root) 
var.set('Choose Carrier...') 
option = OptionMenu(root, var, 'DHL','DPD','DX','Fedex','Geodis','Hermes','WN Direct') 
option.config(relief=RAISED, highlightbackground='#A2B5CD') 
option.grid(row=0,column=1, sticky=W, pady = 10) 

browser = Button(root, text = 'Browse Invoice...', command=Choose_Path) 
browser.grid(row=1, column=1, sticky=W, pady=10) 
b1 = Button(root, text='Accept and Close', command = CloseGUI).grid(column=1, sticky=S) 
mainloop() 

print var.get() 
print path 

Vielen Dank für Ihre Hilfe! +1

0

Zwei Fragen:

-Sie gehen, um herauszufinden, haben, wenn Ihre Wurzel des mainloop zu beenden. Von dem Moment an, an dem Sie root.mainloop() aufrufen, wird das Programm zur nächsten Zeile (die Sie nicht haben, aber ich nehme an, dass Sie in Ihrem endgültigen Programm sein werden), bis Sie das Tk-Fenster schließen.

-Nachdem die Hauptschleife beendet ist, müssen Sie Ihre Variablenwerte irgendwo haben. Derzeit enthält das option Objekt (das eine OptionMenu Instanz ist) den Wert, wenn Ihr Träger, so können Sie einfach etwas wie option.get() tun. Der Dateiname ist etwas komplizierter, weil Sie das nicht irgendwo speichern: Sie geben es von Choose_Path() zurück, aber der Rückgabewert wird nirgendwo gespeichert. Wahrscheinlich müssen Sie diesen Wert in einem globalen speichern. (Diese Speicherung muss innerhalb von Choose_Path, beispielsweise FileName = askopenfilename() anstelle von return askopenfilename() erfolgen).

+0

Vielen Dank für die schnelle Antwort! Also muss ich eine root.exit() hinzufügen, um mit der nächsten Zeile meines Skripts fortzufahren? Ich habe die root.exit() zu dem Befehl der Schaltfläche zum Akzeptieren und Schließen hinzugefügt .... Drucken options.get() druckt immer noch nichts, obwohl:/Ich habe auch die return-Anweisung zu dem, was Sie vorgeschlagen, aber immer noch verwirrt Wie greife ich später auf diese Variable zu? –

+0

Sie können möglicherweise vermeiden, root.mainloop zu verwenden, indem Sie stattdessen root.update verwenden. Ich habe jedoch nicht mit dem Dateidialog und OptionMenu experimentiert. –

+0

@Luke: eigentlich lag ich falsch bei 'option.get()' - das sollte 'var.get()' sein. Sie müssen das Ergebnis später in einer Variablen speichern (fügen Sie zum Beispiel am Ende Ihres Codes 'carrier = var.get()' hinzu. Ich bin mir nicht sicher, woher die Verwirrung über den Pfad kommt. Versuchen Sie, 'path = [None]' am Anfang Ihres Codes hinzuzufügen, und dann 'path [0] = askopenfilename()' innerhalb 'Choose_Path'. Am Ende Ihres Codes wird 'path = path [0]' dann den Pfad erhalten. (Ich benutze eine Liste, um zu vermeiden, dass man hier Globals deklariert. Nicht unbedingt optimal.) – acdr