如何在“按钮"中调用带参数的函数来自“tkinter"的函数蟒蛇包? [英] How to call a function with arguments in "Button" function from "tkinter" python package?
问题描述
1.创建带有选择文件选项的文件对话框1.1 选择文件读取位置的第一个按钮->能够使用以下链接提供的解决方案来做到这一点
1.To create a File Dialog box with an option to select a file 1.1 First button to select file read its location ->Able to do it with the solution provided from below link
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror
class MyFrame(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title("Example")
self.master.rowconfigure(5, weight=1)
self.master.columnconfigure(5, weight=1)
self.grid(sticky=W+E+N+S)
self.button = Button(self, text="Browse", command=self.load_file, width=10)
self.button.grid(row=1, column=0, sticky=W)
def load_file(self):
fname = askopenfilename(filetypes=(("Template files", "*.tplate"),
("HTML files", "*.html;*.htm"),
("All files", "*.*") ))
if fname:
try:
print("""here it comes: self.settings["template"].set(fname)""")
except: # <- naked except is a bad idea
showerror("Open Source File", "Failed to read file\n'%s'" % fname)
return
if __name__ == "__main__":
MyFrame().mainloop()
1.2 第二个按钮开始处理->通过添加另一个按钮开始->添加一个带有参数 process_it 的函数.->所以带参数的函数调用不适用于我的代码
1.2 Second button to start processing ->By adding another button to start ->Adding a function with argument process_it. ->So function call with argument is not working for my code
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror
class MyFrame(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title("Example")
self.master.rowconfigure(5, weight=1)
self.master.columnconfigure(5, weight=1)
self.grid(sticky=W+E+N+S)
self.button = Button(self, text="Browse", command=self.load_file, width=10)
self.button.grid(row=1, column=0, sticky=W)
#new code added by me:
self.button = Button(self, text="Start Now", command=self.process_it(arg_1), width=10)
self.button.grid(row=2, column=0, sticky=W)
def load_file(self):
#new code added by me:
global arg1
fname = askopenfilename(filetypes=(("Template files", "*.tplate"),
("HTML files", "*.html;*.htm"),
("All files", "*.*") ))
#new code added by me:
arg_1 = fname
if fname:
try:
print("""here it comes: self.settings["template"].set(fname)""")
except: # <- naked except is a bad idea
showerror("Open Source File", "Failed to read file\n'%s'" % fname)
return
# new function added by me:
def process_it(self, arg_1):
#use the arg_1 further, example :
print(arg_1)
if __name__ == "__main__":
MyFrame().mainloop()
推荐答案
您可以编写工厂函数来传递一些参数.
You can write factory function to pass some arguments.
def command_factory(arg_1):
def process_it():
print(arg_1)
return process_it
使用
Button(self, text="Start Now", command=command_factory(arg_1))
或者只是
Button(self, text="Start Now", command=lambda: self.proccess_it(arg_1))
但在这种情况下,您需要确保 arg_1 变量不会更改以避免后期绑定.
But in this case you need to be sure that arg_1 variable is not changing to avoid late binding.
这篇关于如何在“按钮"中调用带参数的函数来自“tkinter"的函数蟒蛇包?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!