我想让我在Entry字段上键入的值自动转换为大写。我这里的代码只接受使用validatecommand在条目中键入的大写字母。
from tkinter import *
root = Tk()
def text(a,b,c):
ind=int(b)
if c == '1': #insert
if not a[ind].isupper():
return False
return True
entry = Entry(root, validate="key")
entry['validatecommand'] = (entry.register(text),'%P','%i','%d')
entry.pack()
root.mainloop()
答案 0 :(得分:1)
如果您想将条目内容转换为大写而不是阻止用户插入非大写字母,您可以将StringVar
与您的条目相关联并使用其trace
(trace_add
因为python 3.6)每次用户修改条目时将条目内容转换为大写的方法。
trace
有两个参数:模式和回调。该模式确定何时调用回调。模式是:
'w'
('write'
for python 3.6):在写入变量时调用回调(这是我在下面的代码中使用的模式),'r'
('read'
):在读取变量时调用回调,'u'
('unset'
):删除变量时调用回调有关回调参数的更多详细信息,请参阅What are the arguments to Tkinter variable trace method callbacks?
import tkinter as tk
def to_uppercase(*args):
var.set(var.get().upper())
root = tk.Tk()
var = tk.StringVar(root)
e = tk.Entry(root, textvariable=var)
e.pack()
try:
# python 3.6
var.trace_add('write', to_uppercase)
except AttributeError:
# python < 3.6
var.trace('w', to_uppercase)
root.mainloop()
答案 1 :(得分:0)
您可以绑定到事件而不是使用.trace(在python 3.x中,未在2.x中测试)。
以下是从接受的答案(由“bevdet”)复制到的verbatum https://bytes.com/topic/python/answers/897918-how-do-i-make-tkinter-text-entry-all-uppercase
您可以将事件绑定到调用函数的窗口小部件,以将文本转换为大写。 您需要初始化Entry小部件的textvariable。在你的情况下,没有别的东西需要关注,否则你可以绑定&lt; FocusOut&gt;到小部件。 &LT; KeyRelease&gt;但是效果很好。
from Tkinter import *
win = Tk()
def caps(event):
v.set(v.get().upper())
Label(win, text='Enter user nick:').pack(side=LEFT)
v = StringVar()
w = Entry(win, width=20, textvariable=v)
w.pack(side=LEFT)
w.bind("<KeyRelease>", caps)
mainloop()
我能够将此方法与自定义验证结合使用(参见B. Oakley回答 Interactively validating Entry widget content in tkinter)在创建Entry小部件后立即将绑定OUTSIDE放置在验证函数中。 重要提示:不要将绑定放在验证函数中,否则会破坏验证函数(请参阅Python tkInter Entry fun的已接受答案以获取解释和可能的解决方法)。