【问题标题】:How to prompt user that caps lock is enabled如何提示用户大写锁定已启用
【发布时间】:2025-11-27 15:20:05
【问题描述】:

当我将光标放在条目小部件中时,我试图检测大写锁定是否打开,但不知道该怎么做。

我在网站上找到了这些答案,但没有一个能满足我的需求:caps locks ans shift key statuscurrent key lock status

from tkinter import *

root = Tk()
root.geometry("400x400")

e1 = Entry(root, width=40)
e1.focus()
e1.pack()

e2 = Entry(root, width=40)
e2.place(x=70, y=100)

root.mainloop()

我欢迎您就如何执行此操作提出建议。

【问题讨论】:

  • 为什么Status of shift and caps lock in Python 没有帮助你?它有你需要的信息。
  • 它打印我点击的鼠标垫的 x 和 y 值
  • @PM2Ring 我认为是因为他们想在关注小部件时检查大写状态,而不是对关注小部件的按键做出反应。 AFAIK 在 tkinter 中无法做到这一点,但有一些特定于平台的方法可以检查它
  • 如果大写锁定打开时,仅在第一次按键后才显示警告,您可以吗?
  • @j_4321 是的,我可以通过任何方式实现接近目标的任何方式都可以

标签: python tkinter


【解决方案1】:

您可以使用条目上的绑定来检测用户是否在大写锁定的情况下键入。事件修饰符Lock 使您能够仅在大写锁定打开时触发事件。因此,通过将您的警告绑定到'<Lock-KeyPress>',每次用户在大写锁定打开时按下一个键时都会显示它。如果您希望警告只显示一次,只需取消绑定with_caps_lock 中的事件即可。

这是一个例子:

import tkinter as tk


def with_caps_lock(event):
    if event.keysym != "Caps_Lock":
        # this if statetement prevent the warning to show up when the user
        # switches off caps lock
        print('WARNING! Caps Lock is on.')
    # unbind to do it only once
    e1.unbind('<Lock-KeyPress>', bind_id)


root = tk.Tk()
root.geometry("400x400")

e1 = tk.Entry(root, width=40)
e1.focus()
e1.pack()
# show warning when the user types with caps lock on
bind_id = e1.bind('<Lock-KeyPress>', with_caps_lock)  

root.mainloop()

【讨论】:

  • 当帽子打开时,我怎样才能让它只打印一次
  • 因为当我关闭它并再次将其重新打开时,它会打印到终端
【解决方案2】:

使用 @_4321 提供的答案,如果 Caps lock 已启用或已禁用以提示用户,则可以将其显示为 Label。如果您不想打印到终端这怎么办。

import tkinter as tk


def with_caps_lock(event):
    if event.keysym != "Caps_Lock":
        ID["text"]= "cap is on man"
    elif event.keysym == "Caps_Lock":
        ID["text"]= "caps is off wowowow"


root = tk.Tk()
root.geometry("400x400")


ID = tk.Label(root, foreground="RED")
ID.place(x=100, y=100)

e1 = tk.Entry(root, width=40)
e1.focus()
e1.pack()
# show warning when the user types with caps lock on
e1.bind('<Lock-KeyPress>', with_caps_lock)

root.mainloop()

【讨论】:

    【解决方案3】:

    仅适用于 Windows:

    from tkinter import *
    import ctypes
    
    hllDll = ctypes.WinDLL ("User32.dll")
    VK_CAPITAL = 0x14
    
    def get_capslock_state():
        return hllDll.GetKeyState(VK_CAPITAL)
    
    def on_focus(event):
        if (get_capslock_state()):
            print("Caps lock is on")
    
    root = Tk()
    root.geometry("400x400")
    
    e1 = Entry(root, width=40)
    e1.focus()
    e1.pack()
    
    e2 = Entry(root, width=40)
    e2.place(x=70, y=100)
    
    e2.bind("<FocusIn>", on_focus)
    
    root.mainloop()
    

    【讨论】:

    • 顺便说一句,建议您不要在一个容器小部件中混合布局管理器(位置、包、网格),它们不合作。
    • @PM2Ring 不得不承认,甚至没有看到,只是从上面的问题中复制并添加了绑定...