gpt4 book ai didi

Python 3 - Tkinter 按钮命令

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:51 24 4
gpt4 key购买 nike

我也是 Tkinter 和 Python 的新手。我的 Tkinter 框架中有三个带命令的按钮。按钮 1 调用 open_csv_dialog(),打开文件对话框以选择 .csv 文件并返回路径。按钮 2 调用 save_destination_folder(),打开文件对话框以打开首选目录并返回路径。

我的问题出在按钮 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()

最佳答案

这可能只是输入问题的错误....但为了这一行的完整性

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()

关于Python 3 - Tkinter 按钮命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com