2016-08-03 4 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 о командах и обыскал SO для получения возможного ответа, поэтому извиняюсь, если об этом ответили раньше, и я не смог его найти.

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, поэтому установка переменной в метод widget + geometry manager просто устанавливает эту переменную в ничто, вместо ссылки на объект виджетов.

Так что, если вы на самом деле нужна ссылка на этот виджет вы должны реально сделать:

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

Если вам не нужна ссылка, то просто не назначать ничего и сэкономить немного печатать, так как это излишний.

Для фактического вопроса:

Если я правильно понял ваш вопрос, у вас есть две кнопки, которые устанавливают путь к файлу в формате CSV и папку назначения. Однако, поскольку обе ваши функции используют диалоговое окно, вам предлагается снова, даже если оно уже выбрано.

Вы можете использовать глобал и различные другие способы сделать это, я установить атрибут на базу корневого окна, так как я думаю, что это самое простое здесь ...

В приведенном ниже коды, что я был просто установите атрибут в окне root, если выбрано значение file_path. Вы можете проверить это с помощью инструкции if.

Затем я либо звоню check_state, чтобы узнать, имеет ли корневое окно оба этих атрибута. 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

Смежные вопросы