我也是Tkinter和Python的新手。我的Tkinter框架中有三个带命令的按钮。按钮1调用open_csv_dialog(),打开文件对话框以选择.csv文件并返回路径。按钮2调用save_destination_folder(),打开文件对话框以打开首选目录并返回路径。
我的问题在于Button 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 :(得分:1)
这可能只是输入问题的错误....但是为了完整性在这一行
.webix_list_item {
white-space: normal;
overflow: visible !important;
height: auto !important;
}
您错过了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
如果您不需要参考,那么就不要分配任何内容并为自己节省一些打字,因为它是多余的。
对于实际问题:
如果我理解你的问题,你有两个按钮,用于设置.csv和目标文件夹的文件路径。但是,由于您的两个函数都使用了对话框,因此即使可能已经选择了,也会再次提示您。
您可以使用全局变量和其他各种方法来执行此操作,我将在基本根窗口上设置属性,因为我认为这是最简单的...
在下面的代码中,如果已选择 button3 = ttk.Button(*)
button3.pack()
,我只需在root
窗口设置一个属性即可。您可以使用file_path
声明进行检查。
然后在我调用if
以查看根窗口是否具有这两个属性check_state
将返回属性,如果属性不存在则返回默认值。因此,通过将file_path设置为字符串,或者如果重新选择位置,则为None,状态将始终正确更新。
你可以再清理一下。如果你真的想要,你实际上可以同时制作这两个功能。
getattr(object, string, default)