Tkinter Button控件command传参问题的解决方式

tkinter是Python官方自带的GUI框架,简单好用,其中最常用的恐怕就是Button控件了。这个控件就是在GUI上显示一个按钮,用户点击后,除法command参数所对应的函数。不过,这里有一个很多人都在咨询的问题,如何在Button控件的command中传递参数?

错误的传参写法

下面这段代码,希望实现的功能,是点击clickme按钮后,能够将tstr变量中的字符串在Label中显示出来。
Tkinter Button控件command传参问题的解决方式

正确的操作如下:

一、使用command=lambda: 的形式传参

 
  1. from tkinter import *
  2. import tkinter.messagebox as messagebox
  3.  
  4.  
  5. def createpage(master):
  6. master = Frame(root)
  7. master.pack()
  8. Label(master, text='num1').grid(row=0, column=0, stick=W, pady=10)
  9. e1 = Entry(master)
  10. e1.grid(row=0, column=1, stick=E)
  11. Label(master, text='num2').grid(row=1, column=0, stick=W, pady=10)
  12. e2 = Entry(master)
  13. e2.grid(row=1, column=1, stick=E)
  14. # Button传递参数
  15. Button(
  16. master, text='加', command=lambda: btn_def(e1.get(), e2.get())
  17. ).grid(row=2, column=0, stick=W)
  18. Button(master, text='减').grid(row=2, column=1, stick=E)
  19. Label(master, text='说明').grid(row=3, column=0, stick=W, pady=10)
  20. Label(master, text='只写了加法(请输入简单数字测试button传参)').grid(
  21. row=3, column=1, stick=E
  22. )
  23.  
  24. def btn_def(num1, num2):
  25. num = int(num1) + int(num2)
  26. messagebox.showinfo('结果', '%d' % num)
  27.  
  28. if __name__ == '__main__':
  29. root = Tk()
  30. root.title('Demo')
  31. root.geometry('400x150')
  32. createpage(root)
  33. root.mainloop()
  34.  

二、使用StringVar()和Entry textvariable对参数进行绑定

 
  1. from tkinter import *
  2. import tkinter.messagebox as messagebox
  3.  
  4. class A:
  5. """
  6. 使用StringVar() 和 textvariable
  7. 对Button进行绑定
  8. 实现Button对数据进行操作
  9. 解决Button传参问题
  10. StringVar()的数需要使用.get()获取值
  11. """
  12. def __init__(self, master):
  13. self.root = Frame(master)
  14. self.num1 = StringVar() # 第一个数字
  15. self.num2 = StringVar() # 第一个数字
  16. self.createpage()
  17.  
  18. def createpage(self):
  19. self.root.pack()
  20. Label(self.root, text='num1').grid(row=0, column=0, stick=W, pady=10)
  21. # textvariable和StringVar的num1绑定
  22. Entry(self.root, textvariable=self.num1).grid(row=0, column=1, stick=E)
  23. Label(self.root, text='num2').grid(row=1, column=0, stick=W, pady=10)
  24. # textvariable和StringVar的num2绑定
  25. Entry(self.root, textvariable=self.num2).grid(row=1, column=1, stick=E)
  26. # Button传递参数
  27. Button(
  28. self.root, text='加', command=self.btn_def
  29. ).grid(row=2, column=0, stick=W)
  30. Button(self.root, text='减').grid(row=2, column=1, stick=E)
  31. Label(self.root, text='说明').grid(row=3, column=0, stick=W, pady=10)
  32. Label(self.root, text='只写了加法(请输入简单数字测试button传参)').grid(
  33. row=3, column=1, stick=E
  34. )
  35.  
  36. def btn_def(self):
  37. # 使用.get()获取值
  38. num = int(self.num1.get()) + int(self.num2.get())
  39. messagebox.showinfo('结果', '%d' % num)
  40.  
  41. if __name__ == '__main__':
  42. root = Tk()
  43. root.title('Demo2')
  44. root.geometry('400x150')
  45. A(root)
  46. root.mainloop()
  47.  

以上两种方式都是使用了Button进行数据事件处理,方法一为Button command下传递参数,方法二为控件下使用textvariable对StringVar的参数进行绑定。(我比较推荐使用方法二)。