再次尝试这个...我有一个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()
答案 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()