按钮中的命令在不显示按钮小部件的情况下执行。(Python tkinter)

2024-09-28 18:15:33 发布

您现在位置:Python中文网/ 问答频道 /正文

(尝试1):按钮中的命令在不显示按钮小部件的情况下执行。(我希望用户单击浏览按钮选择文件) (尝试2):如果我使用lambda,则按钮执行后的下一段代码立即抛出错误。因为只有在执行按钮命令后,merge\u doc=MailMerge(file\u name)才会获取其文件名。请建议

尝试1

from tkinter import *
from tkinter import ttk
from mailmerge import MailMerge
import tkinter as tk
import os
from tkinter import filedialog
import tkinter.font as font


root = tk.Tk()
root.geometry("")
root.title("Test")

file_name=""

def main():
    global file_name
    file = filedialog.askopenfile(initialdir="./")
    if file: 
        file_name=file.name
 
browse_button = Button(root, text ='BROWSE',command=main())
browse_button.grid(row=1, column=0, padx=10, ipadx=25,ipady=35)
browse_button.grid_forget()

merge_doc = MailMerge(file_name)

尝试2

from tkinter import *
from tkinter import ttk
from mailmerge import MailMerge
import tkinter as tk
import os
from tkinter import filedialog
import tkinter.font as font



root = tk.Tk()
root.geometry("")
root.title("Test")



file_name=""

def main():
    global file_name
    file = filedialog.askopenfile(initialdir="./")
    if file: 
        file_name=file.name
 
browse_button = Button(root, text ='BROWSE',command=lambda:main())
browse_button.grid(row=1, column=0, padx=10, ipadx=25,ipady=35)
browse_button.grid_forget()


merge_doc = MailMerge(file_name)

尝试2时引发错误:

Traceback (most recent call last):
File "C:\Users\Rocky\Desktop\TEST\Testnew.py", line 30, in <module>
merge_doc = MailMerge(file_name)
File "C:\Python38\lib\site-packages\mailmerge.py", line 25, in __init__
self.zip = ZipFile(file)
File "C:\Python38\lib\zipfile.py", line 1251, in __init__
self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: ''

Tags: namefromimportdoctkinterasbuttonroot
3条回答

第二次尝试时,将merge_doc = MailMerge(file_name)语句放在main()上的if file:块中

因为,当python读取代码时,最初file_name变量包含""。因此,在按下任何按钮之前,它调用merge_doc = MailMerge(file_name),其中file_name""。因此,如果要在选择文件后调用该方法,请将其放入if块中

如果希望用户单击浏览按钮选择文件,则可以使用wait_variable()

import tkinter as tk
from tkinter import filedialog
from mailmerge import MailMerge

root = tk.Tk()

filename = tk.StringVar()

def main():
    file = filedialog.askopenfilename(initialdir='./')
    filename.set(file)

browse_button = tk.Button(root, text='BROWSE', command=main)
browse_button.grid(row=1, column=0, padx=10, ipadx=25, ipady=35)

root.wait_variable(filename) # wait for filename to be updated
browse_button.grid_forget()

# should cater empty filename (user click Cancel in file dialog)
merge_doc = MailMerge(filename.get())
...

请注意,当用户单击“文件选择”对话框中的“取消”按钮时,您需要满足要求

根据您的第一次尝试,您制作了一个按钮并将其网格化为:

browse_button = Button(root, text ='BROWSE',command=main())
browse_button.grid(row=1, column=0, padx=10, ipadx=25,ipady=35)

然后调用grid_forget()函数,该函数将使按钮从tkinter窗口消失

browse_button.grid_forget()

毕竟,您必须添加root.mainloop()才能无限地运行窗口。 改变

browse_button = Button(root, text ='BROWSE',command=main())

browse_button = Button(root, text ='BROWSE',command=main)

相关问题 更多 >