davidmou 发表于 2023-8-27 19:03:03

tkinter的command问题

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

在你的代码中,问题出现在这一行:

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参数,而不是调用它:

self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")


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

修改后的代码如下:

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"。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-27 19:04:00

问题出在这一行代码上:

self.button = tk.Button(frame, foreground = 'blue', command = self.hanshu(), text = "nijh" )


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

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

self.button = tk.Button(frame, foreground='blue', command=self.hanshu, text="nijh")


这样,当按钮被点击时, self.hanshu 函数才会被调用,而不是在创建按钮时就被调用。

歌者文明清理员 发表于 2023-8-27 20:29:46

把函数当成变量,应该传变量本身而不是他的结果
页: [1]
查看完整版本: tkinter的command问题