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

时间:2018-07-20 19:16:10

标签: python tkinter widget

脚本应打开一个带有两个可见按钮的应用程序。按下“ Hello”按钮后,新的按钮将并入第1行,“ Hello”按钮将被停用。按下此新按钮后,应将自己从网格中删除,然后重新激活hello按钮,但不会这样做。

请选中video以查看其操作。

已修改代码以评论建议

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()

2 个答案:

答案 0 :(得分:2)

最初,Log internal note是指一种方法。然后,您执行以下操作:

self.new_button

该效果将删除该方法,并用按钮小部件本身替换它。

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

答案 1 :(得分:1)

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

那就是说,您还可以更改一些内容,以使代码更简洁,并且进行1项更改,我认为真正需要做的是如何从网格中删除new_button。当您执行grid_remove()时,这只会使小部件脱离屏幕,而不会摆脱小部件。然后,下次您按下say_hi按钮时,您将最终创建一个新按钮,而旧按钮仍然存在。相反,我想我会在按钮上使用destroy(),然后让say_hi重新创建它。

请参阅此修订版代码。您将了解创建小部件时配置所有东西的意思,并且您无需编写自己的退出函数,只需在退出按钮命令中进行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()