python-Tkinter检查哪个条目最后具有焦点
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-Tkinter检查哪个条目最后具有焦点,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2828字,纯文字阅读大概需要5分钟。
内容图文
![python-Tkinter检查哪个条目最后具有焦点](/upload/InfoBanner/zyjiaocheng/668/d6cd0d67aad14424adf12b853e292004.jpg)
我正在开发一个具有使用Tkinter创建的虚拟键盘的程序.启用了键盘的页面具有条目小部件,用户需要在其中输入数据.我正在使用pyautogui作为虚拟键盘的一部分来模拟键盘按下,但是我的问题是当用户按下键盘上的任何按钮时会聚焦的小部件.由于每个键盘按钮在按下键时都是ttk.Button,因此按钮具有焦点,而不是他们选择要输入数据的Entry小部件.
这样,我现在有了运行按键的方法,在执行按键之前调用特定的小部件成为焦点.这是我现在拥有的代码:
import tkinter as tk
from tkinter import ttk
import pyautogui
def drawKeyboard(parent):
keyboardFrame = tk.Frame(parent)
keyboardFrame.pack()
keys = [
[ ("Alpha Keys"),
[ ('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'),
(' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'),
('capslock', 'z', 'x', 'c', 'v', 'b', 'n', 'm'),
('delete', 'backspace', 'home', 'end')
]
],
[ ("Numeric Keys"),
[ ('7', '8', '9'),
('4', '5', '6'),
('1', '2', '3'),
(' ', '0', ' ')
]
]
]
for key_section in keys:
sect_vals = key_section[1]
sect_frame = tk.Frame(keyboardFrame)
sect_frame.pack(side = 'left', expand = 'yes', fill = 'both', padx = 10, pady = 10, ipadx = 10, ipady = 10)
for key_group in sect_vals:
group_frame = tk.Frame(sect_frame)
group_frame.pack(side = 'top', expand = 'yes', fill = 'both')
for key in key_group:
key = key.capitalize()
if len(key) <= 1:
key_button = ttk.Button(group_frame, text = key, width = 4)
else:
key_button = ttk.Button(group_frame, text = key.center(5, ' '))
if ' ' in key:
key_button['state'] = 'disable'
key_button['command'] = lambda q=key.lower(): key_command(q)
key_button.pack(side = 'left', fill = 'both', expand = 'yes')
def key_command(event):
entry1.focus()
pyautogui.press(event)
return
root = tk.Tk()
entry1 = tk.Entry(root)
entry1.pack()
entry2 = tk.Entry(root)
entry2.pack()
drawKeyboard(root)
root.mainloop()
显然,如果我想将数据输入到entry2中,则手动调用entry1.focus()对我没有好处.如果我想将数据放入entry1,则调用entry2.focus()不好.那么,每次按下我的一个按钮时,有没有办法让我查看上一次哪个Entry Widget具有焦点?
我需要检查特定条目的小部件,因为最终屏幕上还会有一些单选按钮等.谢谢你的时间
编辑:我快速更改了代码,将Shift键替换为Capslock键.我意识到我的代码的工作方式Shift实际上将永远无法工作,因为您无法完全按下并按下另一个按钮.
解决方法:
您可以将属性takefocus设置为False,以防止按钮获得焦点.不幸的是,它的副作用是无法使用键盘来遍历按钮(可能没问题,因为您处于无键盘状态)
...
key_button = ttk.Button(..., takefocus=False)
...
def key_command(event):
entry = root.focus_get()
entry.insert("end", event)
pyautogui.press(event)
return
另一解决方案是在< FocusIn>上添加绑定.您可以将小部件保存在全局变量中的事件.
def key_command(event):
focused_entry.insert("end", event)
pyautogui.press(event)
return
def remember_focus(event):
global focused_entry
focused_entry = event.widget
entry1.bind("<FocusIn>", remember_focus)
entry2.bind("<FocusIn>", remember_focus)
如果您有许多条目窗口小部件,则可以对Entry类进行类绑定:
root.bind_class("Entry", "<FocusIn>", remember_focus)
内容总结
以上是互联网集市为您收集整理的python-Tkinter检查哪个条目最后具有焦点全部内容,希望文章能够帮你解决python-Tkinter检查哪个条目最后具有焦点所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。