[英]Command in the button executes without showing the button widget.(Python tkinter)
(尝试 1):执行按钮中的命令而不显示按钮小部件。 (我希望用户单击浏览按钮来选择文件)(尝试 2):如果我使用lambda,则在按钮执行后立即执行下一段代码并抛出错误。 由于merge_doc = MailMerge(file_name)只有在执行按钮命令后才能获取其文件名。 请建议。
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)
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: ''
如果您希望用户单击BROWSE按钮选择文件,则可以使用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)
第二次尝试时,将merge_doc = MailMerge(file_name)
语句放在if file:
block on main()
。
因为,当 python 读取代码时,最初file_name
变量包含""
。 因此,在按下任何按钮之前,它会调用merge_doc = MailMerge(file_name)
其中file_name
是""
。 因此,如果要在选择文件后调用该方法,请将其放在 if 块中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.