2011-07-01 40 views

Trả lời

50

Thêm chuỗi Tkinter StringVar vào tiện ích Entry của bạn. Liên kết gọi lại của bạn với StringVar bằng phương pháp theo dõi.

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

Hoàn hảo, cảm ơn! – bfops

+0

Giải pháp của bạn dường như không hoạt động với thành phần 'tự'. – Nicholas

+0

@Nicholas: Mẫu mã hoạt động như hiện trạng. Những gì bạn tìm thấy là mất tích? –

8

Cảm ơn Steven! Tenenter Folklore của Russell Owen giải thích cách lấy giá trị StringVar trực tiếp từ đối số tên (PY_VAR #) bằng globalgetvar(), nhưng không phải cách ánh xạ tên cho một widget. Phương pháp lambda của bạn thay đổi các callback args giống như ma thuật (cho chúng ta những người mới sử dụng Python, ít nhất).

Khi có nhiều mục nhập, thường cần phải biết không chỉ giá trị mà mục nhập đã được thay đổi. Mở rộng trên ví dụ của Steven một chút, sau (Python3) chuyển một chỉ mục có thể được sử dụng để theo dõi nhiều mục nhập.

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

Tại thời điểm viết (2017, Python 3.6, phiên bản tkinter 8.6.6) các tài liệu gợi ý rằng .trace không còn được dùng nữa. Biểu mẫu được đề xuất bây giờ có vẻ là:

sv.trace_add("write", callback) 

Điều này hoạt động rất tốt nếu bạn muốn thông báo bất cứ khi nào biến được thay đổi. Tuy nhiên, ứng dụng của tôi chỉ muốn thông báo khi người dùng hoàn tất chỉnh sửa văn bản. Tôi thấy con heo đất-sự ủng hộ về cơ chế "xác nhận" để làm việc tốt ở đây:

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() 

này sẽ gọi callback bất cứ khi nào widget entry mất tập trung (Tôi đã thêm một phụ tùng nhập 2nd nên một 1st thực sự có thể mất tập trung!)

0

tôi biết các biến thể khác. trước khi tôi nhập mã, nó có thể giải thích tốt hơn con đường của mã hóa: sậy đây http://stupidpythonideas.blogspot.com/2013/12/tkinter-validation.html?view=classic

và có mã của tôi:

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()

có 2 biến thể: bằng cách nhấn nút và nhập vào mục nhập. bây giờ bạn có thể chọn bất kỳ biến thể nào

Các vấn đề liên quan