Python Tkinter新创建的按钮不执行命令

Python Tkinter新创建的按钮不执行命令,python,tkinter,widget,Python,Tkinter,Widget,脚本打开应用程序时应显示两个按钮。当按下Hello按钮时,一个新按钮被网格化到第1行中,Hello按钮将被停用。当按下这个新按钮时,它应该将自己从网格中删除并重新激活hello按钮,但它不会这样做 请检查以查看它的运行情况 编辑代码以评论建议 from tkinter import * class Application(Frame): def __init__(self, master=None): self.master = master self.

脚本打开应用程序时应显示两个按钮。当按下Hello按钮时,一个新按钮被网格化到第1行中,Hello按钮将被停用。当按下这个新按钮时,它应该将自己从网格中删除并重新激活hello按钮,但它不会这样做

请检查以查看它的运行情况

编辑代码以评论建议

from tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        self.master = master
        self.master.geometry('300x100+10+10')
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def new_button(self):
        print("enable_b")
        self.hi_there.config(state=ACTIVE)
        self.new_button.grid_remove()

    def say_hi(self):
        print("hi there, everyone!")
        self.new_button = Button(self)
        self.new_button.config(text = "New BTN", command=self.new_button)
        self.new_button.grid(row=1,column=0)
        self.hi_there.config(state=DISABLED)

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT.config(text="QUIT",fg="red",command=self.quit)
        self.QUIT.grid(row=0,column=1)
        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi
        self.hi_there.grid(row=0,column=0)

    def quit(self):
        self.master.destroy()

def testit(): 
    root = Tk()
    app = Application(master=root)
    app.mainloop()

if __name__ == '__main__':
    testit()

最初,
self.new_按钮
指的是一种方法。然后,您可以这样做:

self.new_button = Button(self)
这将删除该方法,并将其替换为按钮小部件本身


此外,您从不将命令分配给“新建”按钮,因此单击该按钮不会导致调用任何内容。

最初,
self。新建按钮
指的是一种方法。然后,您可以这样做:

self.new_button = Button(self)
这将删除该方法,并将其替换为按钮小部件本身


此外,您从未将命令分配给新按钮,因此单击它不会导致调用任何内容。

在Bryan的回答中提到的2个更正中,您的程序在技术上可以正常工作。我不确定您为什么要花费所有额外的精力为每个字段配置小部件。创建小部件时,可以完成所有配置

也就是说,您还可以更改一些内容以获得更清晰的代码,我认为真正需要做的一个更改是如何从网格中删除
new_按钮。当您执行
grid\u remove()
时,这只会使小部件从屏幕上消失,但不会使小部件消失。然后,下次按下“说你好”按钮时,您将创建一个新按钮,而旧按钮仍然存在。相反,我想我应该在按钮上使用
destroy()
,然后让
说“嗨”
重新创建它

请参阅此代码的修订版本。您将了解我在创建小部件时配置一切的意思,并且您不需要编写自己的退出函数,您只需在quit按钮命令中执行
self.master.destroy

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.master.geometry('300x100+10+10')
        self.create_widgets()

    def new_btn(self):
        print("enable_b")
        self.hi_there.config(state="active")
        self.new_button.destroy()

    def say_hi(self):
        print("hi there, everyone!")
        self.new_button = tk.Button(self, text="New BTN", command=self.new_btn)
        self.new_button.grid(row=1, column=0)
        self.hi_there.config(state="disabled")

    def create_widgets(self):
        tk.Button(self, text="QUIT", fg="red", command=self.master.destroy).grid(row=0,column=1)
        self.hi_there = tk.Button(self, text="Hello", command=self.say_hi)
        self.hi_there.grid(row=0, column=0)

if __name__ == '__main__':
    root = tk.Tk()
    app = Application(master=root).pack()
    root.mainloop()

在Bryan的回答中提到的2项修正中,您的程序在技术上可以正常工作,我不确定您为什么要花费所有额外的精力为每个字段配置小部件。创建小部件时,可以完成所有配置

也就是说,您还可以更改一些内容以获得更清晰的代码,我认为真正需要做的一个更改是如何从网格中删除
new_按钮。当您执行
grid\u remove()
时,这只会使小部件从屏幕上消失,但不会使小部件消失。然后,下次按下“说你好”按钮时,您将创建一个新按钮,而旧按钮仍然存在。相反,我想我应该在按钮上使用
destroy()
,然后让
说“嗨”
重新创建它

请参阅此代码的修订版本。您将了解我在创建小部件时配置一切的意思,并且您不需要编写自己的退出函数,您只需在quit按钮命令中执行
self.master.destroy

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.master.geometry('300x100+10+10')
        self.create_widgets()

    def new_btn(self):
        print("enable_b")
        self.hi_there.config(state="active")
        self.new_button.destroy()

    def say_hi(self):
        print("hi there, everyone!")
        self.new_button = tk.Button(self, text="New BTN", command=self.new_btn)
        self.new_button.grid(row=1, column=0)
        self.hi_there.config(state="disabled")

    def create_widgets(self):
        tk.Button(self, text="QUIT", fg="red", command=self.master.destroy).grid(row=0,column=1)
        self.hi_there = tk.Button(self, text="Hello", command=self.say_hi)
        self.hi_there.grid(row=0, column=0)

if __name__ == '__main__':
    root = tk.Tk()
    app = Application(master=root).pack()
    root.mainloop()

您从不将命令分配给
self.new\u按钮
。在
self.hi\u那里
按钮中设置了命令。您从未将命令分配给
self.new\u按钮
。你在self.hi_那里
按钮中设置了命令。这是一个问题,但也有另一个问题。该命令未分配给新按钮。谢谢。更改了与方法不同的按钮名称,并为正确的按钮分配了命令。谢谢。这是一个问题,但也有另一个问题。该命令未分配给新按钮。谢谢。更改了与方法不同的按钮名称,并为正确的按钮分配了命令。谢谢你。@Martin,Bryan的答案实际上是解决你实际问题的正确答案。我只是添加了一些格式化帮助,以向您展示一个更简单、更清晰的代码示例。我认为你应该保留布莱恩的答案作为正确答案。是的,我知道你在那里做了什么。感谢您的宝贵意见,这将帮助我理解如何编写高效Tkinter应用程序的概念。@Martin,Bryan的答案实际上是解决您实际问题的正确答案。我只是添加了一些格式化帮助,以向您展示一个更简单、更清晰的代码示例。我认为你应该保留布莱恩的答案作为正确答案。是的,我知道你在那里做了什么。感谢您的宝贵意见,这将帮助我理解如何编写高效Tkinter应用程序的概念。