Chính xác như câu hỏi nói. Text
tiện ích con có sự kiện <<Modified>>
, nhưng Entry
tiện ích không xuất hiện.Làm cách nào để nhận được gọi lại sự kiện khi tiện ích Tkinter Entry được sửa đổi?
Trả lời
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()
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()
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!)
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
- 1. Làm thế nào để xóa tiện ích Entry sau khi nhấn một nút trong Tkinter?
- 2. Làm cách nào để kết nối một biến với tiện ích Entry?
- 3. Python tkinter: dừng tuyên truyền sự kiện trong thẻ tiện ích văn bản
- 4. Nhận thông báo/sự kiện/tín hiệu khi tiện ích Qt được lấy nét
- 5. Có cách nào để nghe sự kiện khi một cookie được thay đổi trong Tiện ích mở rộng của Firefox
- 6. Tôi có thể nhận được sự kiện khi thanh địa chỉ được sửa đổi không?
- 7. Làm cho tiện ích Tkinter lấy nét
- 8. Làm cách nào để liên kết nhiều tiện ích với một "liên kết" trong Tkinter?
- 9. Làm cách nào để xử lý sự kiện chọn của tiện ích tab của jquery ui?
- 10. Làm cách nào để biết được bộ sưu tập được lặp lại đã được sửa đổi?
- 11. Tiện ích mở rộng của Chrome: kích hoạt sự kiện khi phần tử được tạo?
- 12. Tkinter có tiện ích bảng không?
- 13. jquery sự kiện thay đổi gọi lại
- 14. Làm cách nào để cập nhật hình ảnh của tiện ích Nhãn Tkinter?
- 15. Thêm phần tử khi sự kiện "DOMNodeInserted" được gọi là
- 16. Làm cách nào để thêm trình xử lý sự kiện CSS AnimationEnd vào tiện ích GWT?
- 17. Cách nhóm các tiện ích tổng hợp gwt thay đổi sự kiện dưới dạng sự kiện thay đổi
- 18. Làm thế nào để gọi một sự kiện tự động khi một hàm được gọi?
- 19. Tiện ích Android không thể nhận được thông báo DATE_CHANGED
- 20. Làm cách nào để thay đổi màu của một số từ nhất định trong tiện ích văn bản tkinter?
- 21. cách đặt kích thước của tiện ích con trong tkinter?
- 22. onGetViewFactory chỉ được gọi một lần cho nhiều tiện ích
- 23. khi nào là sự kiện "DOMNodeInserted" được gọi?
- 24. Cách nhận kích thước của tiện ích con Android sau khi bố cục được tính toán?
- 25. Sự kiện được gọi hàm trong JS?
- 26. Làm cách nào để nhận được giá trị trả lại của phương thức được gọi?
- 27. JavaScript - onclick sự kiện nhận được gọi là tự động
- 28. Có sự kiện nào xảy ra khi DOM được sửa đổi trong MSHTML IE8 không?
- 29. Nút mặc định tkinter trong một tiện ích
- 30. Làm cách nào để buộc Facebook JS-SDK hiển thị các tiện ích được thêm động?
Hoàn hảo, cảm ơn! – bfops
Giải pháp của bạn dường như không hoạt động với thành phần 'tự'. – Nicholas
@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? –