2016-04-22 96 views
0

我正在尋找使用Tkinter構建的簡單的,目前很醜的GUI來從用戶獲得兩個變量。即一個文件路徑和一個下拉選項(OptionMenu)。從Tkinter GUI返回變量

所選變量將在稍後用於Python腳本中,這是我遇到困難的地方。簡而言之,如何將用戶選擇分配給變量:Carrier,Path。

請參閱下面的示例代碼:

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

任何反饋,將不勝感激。提前致謝。

回答

1

通過結合您的反饋意見和多一點額外功能,我現在似乎得到了我需要的結果。請參閱下文,瞭解它現在的樣子。

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 

感謝您的幫助! +1

0

兩個問題:

- 你將不得不弄清楚什麼時候結束你的根主循環。從您撥打root.mainloop()的那一刻開始,目前該程序將不會通知您下一行(您沒有,但我假設您將在您的最終程序中),直到您關閉Tk窗口。

- 主循環結束之後,您需要在某處放置變量值。目前,option對象(它是一個OptionMenu實例)將包含您的運營商的值,因此您可以只執行一些操作,如option.get()。 文件名稍微複雜一點,因爲你不在某個地方存儲:你從Choose_Path()返回它,但返回值不存儲在任何地方。可能你將不得不將這個值存儲在全局中。 (該存儲必須在Choose_Path內發生,例如FileName = askopenfilename()而不是return askopenfilename())。

+0

謝謝你的快速反應!所以我需要添加一個root.exit()來繼續我的腳本的下一行?我已經將root.exit()添加到accept和close按鈕的命令....打印option.get()仍然不打印任何內容:/我也已將return語句更改爲您的建議,但仍然困惑我以後如何訪問這個變量? –

+0

您可以在需要的地方使用root.update來避免使用root.mainloop。但是,我沒有嘗試過使用文件對話框和OptionMenu。 –

+0

@Luke:其實我錯了'option.get()' - 這應該是'var.get()'。您需要稍後將結果存儲在某個變量中(例如,將'carrier = var.get()'添加到代碼的末尾)。雖然我不確定路徑的混亂是從哪裏來的。嘗試在代碼的開頭添加'path = [None]',然後在'Choose_Path'裏面加入'path [0] = askopenfilename()'。然後,在你的代碼結束時,'path = path [0]'會爲你提供路徑。 (我使用一個列表來避免必須在這裏聲明全局變量,不一定是最優的。) – acdr