2016-08-03 9 views
1

저는 Tkinter와 Python을 처음 접했습니다. Tkinter 프레임에 3 개의 버튼이 있습니다. 버튼 1은 open_csv_dialog()를 호출하고 파일 대화 상자를 열어 .csv 파일을 선택하고 경로를 반환합니다. 버튼 2는 save_destination_folder()를 호출하고 선호하는 디렉토리를 열고 경로를 반환하는 파일 대화 상자를 엽니 다.파이썬 3 - Tkinter 버튼 명령

내 문제는 filepaths 버튼 1 버튼 내가 시도 2.

을에서 반환해야합니다 버튼 3. 호출 modify_word_doc()와 함께입니다;

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가 있습니다. –

답변

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를 문자열로 설정하거나 위치를 다시 선택하면 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