退出事件处理后,tkinter.Button保持抑郁的外观

时间:2015-08-03 17:31:30

标签: python button tkinter messagebox

再次尝试这个...我有一个Python编程的GUI,其中按下的按钮在事件处理程序退出后保留按下的外观。事件处理程序使用了消息框。通常情况下,这不会发生。以下是重新创建问题的示例:

import tkinter as tk
from tkinter import messagebox

# post a message
def post_message(event):
    messagebox.showinfo("Sample Messgebox", "close this and look at button")

root = tk.Tk()
b = tk.Button(root, text="Press Me")
b.bind("<Button-1>", func=post_message)
b.pack()
root.mainloop()

2 个答案:

答案 0 :(得分:1)

虽然我不确定为什么你的代码没有正常工作,但由于我对Py很新,我设法重写它以便进行最小的更改。

解决方案1 ​​

bind()

我改变了什么:

不再有command=因为这会导致问题,而是通过在声明Button对象时添加event选项来调用该函数,

另请注意,命令选项不提供使用bind()参数调用的函数,因此必须将其删除,否则将发生错误。

另一种解决方法,这次它与import tkinter as tk from tkinter import messagebox # post a message def post_message(event): root.after(0, lambda: messagebox.showinfo\ ("Sample Messgebox", "close this and look at button")) root = tk.Tk() b = tk.Button(root, text="Press Me") b.bind("<Button-1>", post_message) b.pack() root.mainloop() 一起工作就好了!

解决方案2

master.after(time_in_ms, callback_func)

我使用margin: 0 auto;告诉程序它应该在给定时间之后运行给定的func,这里是0ms所以尽快。

为什么里面有lambda? Lambda是一个动态的,未命名的函数。在参考了您想要调用的函数之后,您不能直接给它参数。

要这样做,就像在这个例子中一样,设置一个将被引用的lambda。

当它最终被调用时,lambda func将调用你想调用的实际函数,为它提供所需的参数。

如果你还不知道lambda是如何工作的,我知道你现在很困惑,所以在这里阅读更多内容,它们非常有用:{{3} }

有关tkinter的最佳信息来源,请访问http://docs.awesomium.net/html/E_Awesomium_Windows_Controls_WebControl_AddressChanged.htm

答案 1 :(得分:1)

blind与事件Button-1一起使用时,您不会使用按钮的主事件。您可以使用参数command激活按钮的主事件。

import tkinter as tk
from tkinter import messagebox

def post_message():
    messagebox.showinfo("Sample Messgebox", "close this and look at button")

root = tk.Tk()
b = tk.Button(root, text="Press Me", command=post_message)
b.pack()
root.mainloop()