2017-05-22 57 views
0

我想讓我在輸入字段上鍵入的值自動轉換爲大寫。我在這裏的代碼只接受使用validatecommand在條目中鍵入的大寫字母。python - 將條目()值轉換爲大寫

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到您的項關聯,並使用其tracetrace_add因爲Python 3.6)方法來轉換每次用戶修改條目時都將條目內容改爲大寫。

trace需要兩個參數:模式和回調。該模式決定何時調用回調。這些模式包括:

  • 'w''write'爲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() 
+0

哇!這就是我正在尋找的。謝謝你的工作基礎,我期待什麼 – Usagi

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


可以綁定一個事件,你的widget調用一個函數將文本轉換爲大寫。 您需要初始化Entry小部件的文本變量。在你的情況下,沒有其他任何事情需要關注,否則你可以將FocusOut> Focus綁定到該小部件。然而,KeyRelease>很好地工作。

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.奧克利的回答 Interactively validating Entry widget content in tkinter)通過將OUTSIDE驗證功能的結合。 重要提示:不要將綁定放入驗證函數中,否則會破壞驗證函數(有關說明和可能的解決方法,請參閱Python tkInter Entry fun的接受答案)。