2016-08-03 197 views
1

我是Tkinter和Python的新手。我有三個按鈕,在我的Tkinter框架中有命令。按鈕1調用open_csv_dialog(),打開文件對話框以選擇.csv文件並返回路徑。按鈕2調用save_destination_folder(),打開文件對話框打開首選目錄並返回路徑。Python 3 - Tkinter按鈕命令

我的問題是按鈕3.它調用modify_word_doc(),它需要從文件路徑按鈕1和按鈕2

我試圖返回;

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

但這顯然只是提示文件對話框,再次爲這兩個open_csv_dialog()和save_destination_folder()函數,這是不希望打開。我想只使用已經從這兩個函數返回的文件路徑,並將其傳遞到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,多一個'('then')''。 –

回答

1

這可能只是一個錯誤輸入的問題....但在這條線的完整性

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

您缺少ttk.Button(*)*.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和目標文件夾的文件路徑兩個按鈕。但是,由於你的兩個函數都使用對話框,所以即使可能已經被選中,也會再次提示你。

您可以使用全局變量和各種其他方式來做到這一點,我將設置根部窗口上的屬性,因爲我認爲這是最簡單的在這裏...

在下面的代碼,我所做的只是如果已選擇file_path,則在root窗口上設置屬性。您可以使用if聲明來檢查。

然後在任何一個電話check_state上查看根窗口是否具有這兩個屬性getattr(object, string, default)將返回屬性或缺省值(如果該屬性不存在)。因此,通過將file_path設置爲字符串,或者如果重新選擇位置,則該狀態將始終正確更新。

你可以清理一些。如果你真的想要的話,你可以實現這兩種功能。

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