2016-04-22 14 views
0

私はTkinterで構築されたシンプルで現在は醜いGUIを使って、ユーザーから2つの変数を取得しています。つまり、ファイルパスとドロップダウンからの選択肢(OptionMenu)です。Tkinter GUIから変数を返す

選択した変数は後でPythonスクリプトで使用されますが、これは難しいところです。ユーザーの選択肢を変数、キャリア、パスにどのように割り当てるかを簡単に説明します。

のサンプルコードは以下を参照してください:

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

2つの問題:

-You'reは、あなたのルートのメインループを終了する際に把握しているつもり。 root.mainloop()に電話をした瞬間から、Tkウィンドウを閉じるまで、現在のプログラムは次の行(あなたは持っていませんが、あなたの最終プログラムにあると思います)に進みません。

メインループが終了した後、変数の値をどこかに置く必要があります。現在、optionオブジェクト(OptionMenuインスタンス)には、キャリアの値が格納されるため、option.get()のような処理を行うことができます。 ファイル名は若干複雑です。なぜなら、そのファイルをどこかに格納していないからです。Choose_Path()から戻しますが、戻り値はどこにも格納されません。おそらく、この値をグローバルに保存する必要があります。 (この保存は、の代わりにFileName = askopenfilename()のようにChoose_Pathの範囲内で発生する必要があります)。

+0

ありがとうございました!だから私はスクリプトの次の行に進むためにroot.exit()を追加する必要がありますか?私は受け入れと閉じるボタンのコマンドにroot.exit()を追加しました.... print option.get()はまだ何も印刷しません:/私はあなたが示唆したもののreturnステートメントを変更しましたが、まだ混乱しています後でこの変数にどのようにアクセスしますか? –

+0

代わりにroot.updateを使用して、root.mainloopの使用を避けることができます。しかし、私はファイルダイアログとOptionMenuを試していません。 –

+0

@ルーク:実際、私は 'option.get()'に間違っていました。これは 'var.get()'でなければなりません。後でこの結果を変数に格納する必要があります(たとえば、コードの末尾に 'carrier = var.get() 'を追加するなど)。私はパスの混乱がどこから来るのかは分かりません。あなたのコードの先頭に 'path = [None]'を追加し、 'Choose_Path'の中に' path [0] = askopenfilename() 'を追加してみてください。次に、コードの最後に、 'path = path [0]'がパスを取得します。 (ここではグローバルを宣言しなくてもいいリストを使用していますが、必ずしも最適ではありません) – acdr