【问题标题】:Tkinter newly created button does not execute commandTkinter 新创建的按钮不执行命令
【发布时间】:2018-07-20 19:16:10
【问题描述】:

脚本应该打开一个带有两个可见按钮的应用程序。当按下 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()

【问题讨论】:

  • 您永远不会将命令分配给self.new_button。您在self.hi_there 按钮中设置了命令。

标签: python tkinter widget


【解决方案1】:

最初,self.new_button 指的是一种方法。然后,你这样做:

self.new_button = Button(self)

该效果会移除该方法并将其替换为按钮小部件本身。

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

【讨论】:

  • 有这个问题,还有另一个问题。该命令未分配给新按钮。
  • 谢谢。更改了与方法不同的按钮名称,并将命令分配给正确的按钮。谢谢。
【解决方案2】:

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

也就是说,您还可以更改一些内容以获得更简洁的代码,并且我认为真正需要进行的更改是如何从网格中删除 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()

【讨论】:

  • @Martin,Bryan 的答案实际上是解决您实际问题的正确答案。我只是添加一些格式帮助,向您展示一个更简单、更简洁的代码示例。我认为您应该保留 Bryan 的答案作为正确答案。
  • 是的,我知道你在那里做了什么。感谢您的宝贵意见,这将帮助我理解如何编写高效的 Tkinter 应用程序的概念。
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 2017-12-23
  • 1970-01-01
  • 2019-05-10
  • 2019-04-20
  • 2016-01-28
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多