Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter重写默认的ctrl-h绑定_Python_Python 3.x_Tkinter_Tkinter Entry - Fatal编程技术网

Python tkinter重写默认的ctrl-h绑定

Python tkinter重写默认的ctrl-h绑定,python,python-3.x,tkinter,tkinter-entry,Python,Python 3.x,Tkinter,Tkinter Entry,我对绑定ctrl-h没有问题。但是,当我执行ctrl-h时,我注意到最后一个字符也从条目中删除。我认为这可能是python默认的ctrl-h绑定。我怎样才能禁用它 ---更新--- 我已经添加了返回'break'内容。但它仍然不起作用。最后一个字符将在askstring对话框显示之前立即删除。下面是绑定的代码 def replace(self): target = simpledialog.askstring(title = 'Replace', prompt = 'Replace Ta

我对绑定ctrl-h没有问题。但是,当我执行ctrl-h时,我注意到最后一个字符也从条目中删除。我认为这可能是python默认的ctrl-h绑定。我怎样才能禁用它

---更新---

我已经添加了
返回'break'
内容。但它仍然不起作用。最后一个字符将在askstring对话框显示之前立即删除。下面是绑定的代码

def replace(self):
    target = simpledialog.askstring(title = 'Replace', prompt = 'Replace Target')
    if not target:
        return 'break'
    withValue = simpledialog.askstring(title = 'Replace', prompt = 'Replace With')
    if not withValue:
        return 'break'
    for entry in self.entries.values():
        setEntry(entry, entry.get().replace(target, withValue))
    return 'break'
顺便说一句,我把它和母版绑定在一起,而不是条目,因为我有很多条目。和主人绑定更容易

我就是这样装订的

self.master.bind(“”,lambda事件:self.replace())

self.master
定义如下:

class Generator(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        ## init variables
        self.master = master
这就是我传递的信息

root = Tk()
gui = Generator(root)
gui.pack()
root.title('Generator')
root.mainloop()

因为您绑定到根窗口而不是单个小部件,所以在函数中无法执行任何操作。绑定按以下顺序处理:

  • 特定小部件上的绑定
  • 小部件类上的绑定
  • 小部件所在的顶级窗口上的绑定
  • 特殊标记“all”上的绑定
  • 如果在处理这些绑定的任何时候,函数返回字符串“break”,则不会进行进一步的处理。因此,如果您在一个特定的小部件上有一个绑定并返回“break”,那么默认的类绑定将不会被处理。但是,如果从绑定返回到根窗口的“break”,则在类绑定之后才会处理该绑定。因此,这种绑定不可能阻止默认行为

    然而,tkinter绑定是非常可定制的,因此有一些解决方案。鉴于您可能希望禁止默认行为,最直接的解决方案是绑定到类以完全替换默认行为,或者单独绑定到每个小部件以防止发生类绑定

    如果您确实希望通过绑定到根窗口使绑定具有通用性,那么最简单的解决方案可能是更改所有具有control-h默认绑定的小部件的处理顺序

    例如,要将根级别绑定的处理移到类级别绑定之前,可以执行以下操作:

    entry = tk.Entry(root)
    bindtags = entry.bindtags()
    entry.bindtags((bindtags[2], bindtags[0], bindtags[1], bindtags[3]))
    
    有关如何处理绑定的详细信息,请查看以下问题:

    下面是一个绑定到根窗口的简单示例,但更改了绑定标记,因此可以通过返回“break”来取消默认绑定:

    将tkinter作为tk导入
    def自定义_退格(事件):
    entry.insert(“insert”,“”)
    返回“中断”
    root=tk.tk()
    entry=tk.entry(根)
    入口包装(fill=“x”)
    bindtags=entry.bindtags()
    entry.bindtags((bindtags[2],bindtags[0],bindtags[1],bindtags[3]))
    root.bind(“,自定义_退格)
    root.mainloop()
    
    在处理程序中返回“break”
    ,以取消对密钥的默认处理。请提供一个简单的问题代码示例。此外,如果条目中有选择项,它还会显示BackSpace键和Control-h删除选择项。如果没有选择,它将删除插入光标左侧的字符。的可能副本请通过提供@BryanOakley来显示如何将
    find
    绑定到control-h。我已对其进行了更新。很抱歉造成混淆,这是替换未找到函数。很抱歉,它不工作。你能在更新区看到我的代码吗?@SeakyLone:我已经更新了我的答案。您添加了原始问题中遗漏的一个重要细节。但如果我只是更改顺序,它在执行我的命令后是否仍会执行预定义的“ctrl-h”?@SeakyLone:如果您返回“break”,任何进一步的处理都会停止。如果在默认绑定之前返回“break”,那么默认绑定将不会发生。谢谢,它可以正常工作。所以每一个条目我都要这么做?
    import tkinter as tk
    
    def custom_backspace(event):
        entry.insert("insert", "<backspace>")
        return "break"
    
    root = tk.Tk()
    entry = tk.Entry(root)
    entry.pack(fill="x")
    bindtags = entry.bindtags()
    entry.bindtags((bindtags[2], bindtags[0], bindtags[1], bindtags[3]))
    
    root.bind("<Control-h>", custom_backspace)
    
    root.mainloop()