鱼C论坛

 找回密码
 立即注册
查看: 1221|回复: 3

[已解决]tkinter的command问题

[复制链接]
发表于 2023-8-27 19:03:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import tkinter as tk
class minster:
    def __init__(self,root):
        frame = tk.Frame(root)
        frame.pack()
        self.button = tk.Button(frame, foreground = 'blue', command = self.hanshu(), text = "nijh" )
        self.button.pack()
    def hanshu(self):
        print("miaoa")
        
a = tk.Tk()
b = minster(a)
a.mainloop()
为什么按下按钮前也会打印出"miaoa",请大神指教
最佳答案
2023-8-27 19:03:37
在你的代码中,问题出现在这一行:

  1. self.button = tk.Button(frame, foreground='blue', command=self.hanshu(), text="nijh")
复制代码


在这里,你使用了command=self.hanshu()来设置按钮的命令。但是你需要注意,command参数接受一个函数对象作为参数,而不是函数的调用结果。

所以,当你写成command=self.hanshu()时,它实际上立即调用了self.hanshu()方法,并将其返回值作为按钮的命令。因此,在按钮创建时就执行了self.hanshu()方法,导致打印了"miaoa"。

要解决这个问题,你只需将self.hanshu作为函数对象传递给command参数,而不是调用它:

  1. self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")
复制代码


通过移除括号,将self.hanshu变为函数对象,这样当按钮被点击时,才会执行self.hanshu()方法,并打印"miaoa"。

修改后的代码如下:

  1. import tkinter as tk

  2. class Minster:
  3.     def __init__(self, root):
  4.         frame = tk.Frame(root)
  5.         frame.pack()
  6.         self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")
  7.         self.button.pack()

  8.     def hanshu(self):
  9.         print("miaoa")

  10. a = tk.Tk()
  11. b = Minster(a)
  12. a.mainloop()
复制代码


现在,当你按下按钮时,才会打印出"miaoa"。
如果问题已经解决,请设置最佳答案

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-27 19:03:37 | 显示全部楼层    本楼为最佳答案   
在你的代码中,问题出现在这一行:

  1. self.button = tk.Button(frame, foreground='blue', command=self.hanshu(), text="nijh")
复制代码


在这里,你使用了command=self.hanshu()来设置按钮的命令。但是你需要注意,command参数接受一个函数对象作为参数,而不是函数的调用结果。

所以,当你写成command=self.hanshu()时,它实际上立即调用了self.hanshu()方法,并将其返回值作为按钮的命令。因此,在按钮创建时就执行了self.hanshu()方法,导致打印了"miaoa"。

要解决这个问题,你只需将self.hanshu作为函数对象传递给command参数,而不是调用它:

  1. self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")
复制代码


通过移除括号,将self.hanshu变为函数对象,这样当按钮被点击时,才会执行self.hanshu()方法,并打印"miaoa"。

修改后的代码如下:

  1. import tkinter as tk

  2. class Minster:
  3.     def __init__(self, root):
  4.         frame = tk.Frame(root)
  5.         frame.pack()
  6.         self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")
  7.         self.button.pack()

  8.     def hanshu(self):
  9.         print("miaoa")

  10. a = tk.Tk()
  11. b = Minster(a)
  12. a.mainloop()
复制代码


现在,当你按下按钮时,才会打印出"miaoa"。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-27 19:04:00 | 显示全部楼层
问题出在这一行代码上:

  1. self.button = tk.Button(frame, foreground = 'blue', command = self.hanshu(), text = "nijh" )
复制代码


在这里,你将 self.hanshu() 作为 command 参数传递给了 Button ,但是你应该只传递函数名而不是调用函数。

正确的写法是将 self.hanshu 作为 command 参数传递,如下所示:

  1. self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")
复制代码


这样,当按钮被点击时, self.hanshu 函数才会被调用,而不是在创建按钮时就被调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-27 20:29:46 | 显示全部楼层
把函数当成变量,应该传变量本身而不是他的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 17:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表