我在这里提出了一个问题,这个问题已经存在了很长时间了,但显然仍然没有解决,更老的解决方法在我的Python3.7.2(Win10上的64位)上是行不通的。
我有这样的代码:
import tkinter as tk
import tkinter.simpledialog
# message box to enter a value where to set the scale to
class EnterValueBox(tk.simpledialog.Dialog):
def body(self, master):
self.e = tk.Entry(self, width=10)
self.e.pack(pady=5)
return self.e # initial focus
def apply(self):
print(self.e.get())
# callback to open message box
def enterValue(event):
EnterValueBox(root, title="Enter Value 0..100")
# create window with scale widget
root = tk.Tk()
scale = tk.Scale(root, orient=tk.HORIZONTAL, from_=0, to=100)
scale.pack()
# unbind any button-3 events
scale.unbind("<ButtonPress-3>")
scale.unbind("<ButtonRelease-3>")
scale.unbind("<Button-3>")
# bind button-3 press event to open message box
scale.bind("<ButtonPress-3>", enterValue)
tk.mainloop()它创建一个带有单个小部件的窗口。我想绑定ButtonPress-3打开一个小对话框直接输入一个新的值。代码只将该值打印到shell,但示例显示取消绑定不起作用,因为在打印值之后,对话框将关闭(当用户单击OK时),然后执行默认绑定,这将设置滑块,用户在滑块小部件的槽中单击该滑块。
我尝试了Deleting and changing a tkinter event binding的解决方法,使用了一个PatchedScale小部件(而不是这里显示的PatchedCanvas ),但这并没有什么区别。
任何帮助都将不胜感激!
发布于 2022-03-22 16:34:56
默认绑定不是在小部件上,而是在小部件类上。在没有特定于小部件的绑定的小部件上调用unbind不会有任何效果。
如果不希望在特定于小部件的绑定之后运行默认绑定,通常的技术是让绑定函数返回字符串break。
def enterValue(event):
EnterValueBox(root, title="Enter Value 0..100")
return "break"https://stackoverflow.com/questions/71575313
复制相似问题