繁体   English   中英

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

[英]Command in the button executes without showing the button widget.(Python tkinter)

(尝试 1):执行按钮中的命令而不显示按钮小部件。 (我希望用户单击浏览按钮来选择文件)(尝试 2):如果我使用lambda,则在按钮执行后立即执行下一段代码并抛出错误。 由于merge_doc = MailMerge(file_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: ''

如果您希望用户单击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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM