Python 3 - Tkinter按钮命令

时间:2016-08-03 16:58:31

标签: python tkinter

我也是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()

1 个答案:

答案 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)