2016-08-03 17 views
1

私はTkinterとPythonも新しくなっています。 Tkinterフレームに3つのボタンがあります。ボタン1はopen_csv_dialog()を呼び出し、ファイルダイアログボックスを開いて.csvファイルを選択し、パスを返します。ボタン2はsave_destination_folder()を呼び出し、ファイルダイアログボックスを開いて優先ディレクトリを開き、パスを返します。Python 3 - Tkinterボタンコマンド

私の問題は、それはファイルパスは私が試してみました、ボタン1とボタン2

から返される必要がありますmodify_word_doc()を呼び出すボタン3です。

button3 = ttk.Button(root, text="Run", command=lambda: modify_word_doc(open_csv_dialog, save_destination_folder)).pack() 

が、それは明らかにただ望ましくないopen_csv_dialog()とsave_destination_folder()関数の両方のために再度開くファイルダイアログボックスを求めるメッセージが表示されます。これらの2つの関数からすでに返されたファイルパスを使用して、別のファイルダイアログボックスでプロンプトを表示せずにmodify_word_docに渡したいだけです。私もpartialを使用しようとしましたが、私はそれを間違って使用しているか、それと同じ望ましくない結果を残しています。

私はコマンドに関するTkinterのドキュメントを読んでいて、可能な答えがあるかどうかを調べたので、これが前に答えられていて、それを見つけられなかった場合には謝ります。

import tkinter as tk 
from tkinter import filedialog 
from tkinter import ttk 
import os 
import csv 
import docx 
from functools import partial 


root = tk.Tk() 


def open_csv_dialog(): 
    file_path = filedialog.askopenfilename(filetypes=(("Database files", 
     "*.csv"),("All files", "*.*"))) 
    return file_path 


def save_destination_folder(): 
    file_path = filedialog.askdirectory() 
    return file_path 


def modify_word_doc(data, location): 
    #data = open_csv_dialog() 
    #location = save_destination_folder() 
    #long code. takes .csv file path opens, reads and modifies word doc with 
    #the contents of the .csv, then saves the new word doc to the requested 
    #file path returned from save_destination_folder(). 


label = ttk.Label(root, text="Step 1 - Choose CSV File.", 
    font=LARGE_FONT) 
label.pack(pady=10, padx=10) 
button = ttk.Button(root, text="Choose CSV", 
    command= open_csv_dialog).pack() 
label = ttk.Label(root, 
    text="Step 2 - Choose destination folder for your letters.", 
    font=LARGE_FONT) 
label.pack(pady=10, padx=10) 
button2 = ttk.Button(root, text="Choose Folder", 
    command=save_destination_folder).pack() 
label = ttk.Label(root, text="Step 3 - Select Run.", font=LARGE_FONT) 
label.pack(pady=10, padx=10) 
button3 = ttk.Button(root, text="Run", 
    command=lambda: modify_word_doc(open_csv_dialog, save_destination_folder)).pack() 


root.mainloop() 
+0

構文エラーbtwがあります。もう1つは '(' '' '')です。 –

答えて

1

これはおそらく、質問を入力するだけで、エラーだった....しかし、あなたはttk.Button(*)*.pack()

のための閉じ括弧が欠落している

button3 = ttk.Button(root, text="Run", command=lambda: modify_word_doc(open_csv_dialog, save_destination_folder).pack() 

このライン上の完全性のためにそれは(あるべき構文的に):

button3 = ttk.Button(root, text="Run", command=lambda: modify_word_doc(open_csv_dialog, save_destination_folder)).pack() 

また、.pack()を使用するとNoneウィジェット+ジオメトリマネージャメソッドに変数を設定すると、ウィジェットオブジェクトへの参照ではなく、変数に何も設定されません。あなたが実際にこのウィジェットへの参照が必要な場合は

だから、あなたが実際に行う必要があります。

button3 = ttk.Button(*) 
button3.pack() 

あなたが参照を必要としない場合、それはだから、その後だけで、何を割り当てて、自分自身にいくつかの入力を保存しません冗長です。

私はあなたの質問を理解していれば、あなたは.CSVと保存先フォルダのファイルパスを設定した2つのボタンがあります:実際の質問については

。しかし、どちらの関数もダイアログを使用しているので、既に選択されている場合でも、再度プロンプトが表示されます。以下のコードで

私は、これはここが最も簡単だと思うので、あなたが、私は基本ルートウィンドウの属性を設定しますこれを行うには、グローバルおよび様々な他の方法を使用することができ

...

は私がやったことは、単純でしたfile_pathが選択されている場合は、rootウィンドウに属性を設定します。これはifステートメントで確認できます。

を呼び出して、ルートウィンドウにこれらの属性が両方とも含まれているかどうかを確認します。getattr(object, string, default)は属性を返します。属性が存在しない場合は既定値を返します。したがって、file_pathを文字列に設定するか、場所が再選択された場合はNoneを指定すると、状態は常に正しく更新されます。

もうこれ以上クリーニングできます。あなたは本当にしたい場合は、実際にそれらのいずれかの機能などの両方を作ることができます。

import tkinter as tk 
from tkinter import filedialog, ttk 

def check_state(): 

    if getattr(root, 'csv_path', False) and getattr(root, 'dest_path', False): 
     button3['state'] = 'normal' 
    else: 
     button3['state'] = 'disabled' 

def open_csv_dialog(): 

    file_path = filedialog.askopenfilename(
     filetypes=(("Database files", "*.csv"), ("All files", "*.*"))) 
    if file_path: 
     root.csv_path = file_path 
    else: 
     root.csv_path = None 
    check_state() 

def save_destination_folder(): 

    file_path = filedialog.askdirectory() 
    if file_path: 
     root.dest_path = file_path 
    else: 
     root.dest_path = None 
    check_state() 

def modify_word_doc(): 
    print(root.csv_path, root.dest_path) 

root = tk.Tk() 
ttk.Label(root, text="Step 1 - Choose CSV File.",).pack(pady=10, padx=10) 
ttk.Button(root, text="Choose CSV", command= open_csv_dialog).pack() 
ttk.Label(root, text="Step 2 - Choose destination folder for your letters.").pack(pady=10, padx=10) 
ttk.Button(root, text="Choose Folder", command=save_destination_folder).pack() 
ttk.Label(root, text="Step 3 - Select Run.").pack(pady=10, padx=10) 

#We need a reference to the widget here, for the state func... 

button3 = ttk.Button(root, text="Run", state='disabled', command=modify_word_doc) 
button3.pack() 
root.mainloop() 
+1

完璧!これはまさに私が必要としていたものです!このような徹底的な対応と、冗長コードのクリーンアップに感謝します。はい、質問を入力したときに構文エラーが発生しました。 – BWhite