【问题标题】:Make tkinter.Entry readonly but not grayed out使 tkinter.Entry 只读但不灰显
【发布时间】:2019-03-11 09:38:06
【问题描述】:

我喜欢默认的 tkinter entry-widget 的外观,但我希望将其设为只读而不变灰。

import tkinter as tk
root = tk.Tk()
entry1_var = tk.StringVar(root, value='Entry1')
entry1 = tk.Entry(root, textvariable=entry1_var)
entry1.configure(state='disabled')
#entry1.configure(background="white") does nothing
entry1.grid()
root.mainloop()

我可以更改条目的样式还是应该尝试让标签看起来像默认条目?

编辑

此外,是否可以在只读/禁用时保持条目的文本可选?

【问题讨论】:

    标签: python python-3.x user-interface tkinter


    【解决方案1】:

    当条目被禁用时,背景和前景有一个特殊选项:disabledbackgrounddisabledforeground。因此,要使禁用条目看起来更像常规条目,您可以使用:

    entry1.configure(disabledbackground="white", disabledforeground="black")
    

    要仍然能够选择文本,您可以使用不同的策略。不要将状态设置为禁用,而是使用validatecommand 禁止所有编辑:

    import tkinter as tk
    
    def validate():
        return False
    
    root = tk.Tk()
    
    vcmd = (root.register(validate))
    
    entry1_var = tk.StringVar(root, value='Entry1')
    entry1 = tk.Entry(root, textvariable=entry1_var, validatecommand=vcmd)
    entry1.update()
    entry1.configure(validate="key")
    entry1.grid()
    
    root.mainloop()
    

    唯一需要注意的是,当您强制进行验证不应允许的编辑时,例如使用 entry1_var.set('text'),验证将被禁用(这也是我们需要 entry1.update() 主动设置的原因开始验证之前的文本)。因此,要更改文本,您需要禁用验证,更新文本并重新启用验证,如:

    entry1.configure(validate="none")
    entry1_var.set("text")
    entry1.configure(validate="key")
    

    【讨论】:

      【解决方案2】:

      您也可以将事件绑定到所有键上的break。您仍然可以通过鼠标选择文本。

      import tkinter as tk
      
      root = tk.Tk()
      entry = tk.Entry(root)
      entry.insert(0,"This is a test")
      entry.pack()
      
      def disable_entry(event):
          if event.state == 12 and (event.keysym == 'c' or event.keysym == "a"):
              return
          else:
              return "break"
      
      entry.bind("<Key>", disable_entry)
      entry.bind("<Button-2>", disable_entry)
      
      root.mainloop()
      

      【讨论】:

      • 这很好,因为它很简单,但我认为它有一些缺点。选择文本时使用 middel 鼠标按钮复制粘贴文本(也可以通过将 disable_entry 绑定到 &lt;Button-2&gt; 来修复),并且诸如 Ctrl-A 和箭头键之类的东西不再起作用。
      • 同意 - 我稍微编辑了它以包含 ctrl+cctrl+a
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2021-09-30
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多