2011-07-01 93 views

回答

50

將Tkinter StringVar添加到您的Entry小部件中。使用trace方法將您的回調綁定到StringVar。

from Tkinter import * 

def callback(sv): 
    print sv.get() 

root = Tk() 
sv = StringVar() 
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv)) 
e = Entry(root, textvariable=sv) 
e.pack() 
root.mainloop() 
+0

完美,謝謝! – bfops

+0

您的解決方案似乎不適用於'self'組件。 – Nicholas

+0

@Nicholas:代碼示例按原樣運行。你找不到什麼? –

8

謝謝史蒂芬! Russell Owen的Tkinter Folklore解釋瞭如何使用globalgetvar()直接從name參數(PY_VAR#)獲取StringVar值,但不知道如何將名稱映射到一個小部件。你改變回調參數的lambda方法就像魔術一樣(對我們來說,Python新手至少)。

當有多個條目時,通常不僅需要知道該值,而且知道哪些條目已更改。稍微擴展Steven的例子,下面的(Python3)傳遞一個索引,它可以用來跟蹤多個條目。

from tkinter import Tk, Frame, Label, Entry, StringVar 

class fruitlist: 
    def entryupdate(self, sv, i): 
     print(sv, i, self.fruit[i], sv.get()) 

    def __init__(self, root): 
     cf = Frame(root) 
     cf.pack() 
     self.sva = [] 
     self.fruit = ("Apple", "Banana", "Cherry", "Date") 
     for f in self.fruit: 
      i = len(self.sva) 
      self.sva.append(StringVar()) 
      self.sva[i].trace("w", lambda name, index, mode, var=self.sva[i], i=i: 
           self.entryupdate(var, i)) 
      Label(cf, text=f).grid(column=2, row=i) 
      Entry(cf, width=6, textvariable=self.sva[i]).grid(column=4, row=i) 

root = Tk() 
root.title("EntryUpdate") 
app = fruitlist(root) 
root.mainloop() 
6

在寫這篇文章時(2017年,3.6的Python,Tkinter的版本8.6.6)的文檔顯示,.trace已被棄用。建議的表格現在似乎是:

sv.trace_add("write", callback) 

如果您希望在變量發生變化時通知您,那麼這種方式非常有效。但是,我的應用程序只是在用戶完成編輯文本時才需要通知。我發現了「驗證」機制捎帶很好地在這裏工作:

from tkinter import * 

root = Tk() 
sv = StringVar() 

def callback(): 
    print(sv.get()) 
    return True 

e = Entry(root, textvariable=sv, validate="focusout", validatecommand=callback) 
e.grid() 
e = Entry(root) 
e.grid() 
root.mainloop() 

這將調用callback每當錄入組件失去焦點(我加了2次進入構件,因此第一次可以真正失去焦點!)

0

我知道其他的變種。 之前,我輸入的代碼,它可以更好地解釋編碼的路徑:蘆葦這裏http://stupidpythonideas.blogspot.com/2013/12/tkinter-validation.html?view=classic

,並有我的代碼:

from Tkinter import * 
 

 
class ttt: 
 
    def __init__(self): 
 
     self.str1 = StringVar() 
 
     self.e1 = Entry(root, textvariable=self.str1) 
 
     self.str1.trace('w', self.callback_1) 
 
     self.e1.pack() 
 
     
 
     self.str2 = StringVar() 
 
     self.e2 = Entry(root, textvariable=self.str2, state='readonly') 
 
     self.e2.pack() 
 
     
 
     self.str3 = StringVar() 
 
     self.e3 = Entry(root, textvariable=self.str3, state='readonly') 
 
     self.e3.pack() 
 
     
 
     bt = Button(root, text = 'ещё', command = self.callback_2) 
 
     bt.pack() 
 
    
 
    def callback_1(self, name='', index='', mode=''): 
 
     tmp = self.str1.get() 
 
     if tmp: 
 
     self.str2.set(int(tmp) * 6) 
 
     print self.str2.get() 
 
    
 
    def callback_2(self, name='', index='', mode=''): 
 
     tmp = self.str1.get() 
 
     if tmp: 
 
     self.str3.set(int(tmp) * 6) 
 
     print self.str3.get() 
 

 
root = Tk() 
 
t = ttt() 
 
root.mainloop()

有2株:只需按下按鈕,和進入條目。 現在你可以選擇任何變種

相關問題