Bạn cũng có thể bật lên cửa sổ công cụ với các trường có thể chỉnh sửa được liệt kê với Mục nhập để cập nhật giá trị. Ví dụ này có một lượt xem tre với ba cột và không sử dụng các lớp con.
Bind nhấn đúp chuột của bạn như thế này:
def OnDoubleClick(self, treeView):
# First check if a blank space was selected
entryIndex = treeView.focus()
if '' == entryIndex: return
# Set up window
win = Toplevel()
win.title("Edit Entry")
win.attributes("-toolwindow", True)
####
# Set up the window's other attributes and geometry
####
# Grab the entry's values
for child in treeView.get_children():
if child == entryIndex:
values = treeView.item(child)["values"]
break
col1Lbl = Label(win, text = "Value 1: ")
col1Ent = Entry(win)
col1Ent.insert(0, values[0]) # Default is column 1's current value
col1Lbl.grid(row = 0, column = 0)
col1Ent.grid(row = 0, column = 1)
col2Lbl = Label(win, text = "Value 2: ")
col2Ent = Entry(win)
col2Ent.insert(0, values[1]) # Default is column 2's current value
col2Lbl.grid(row = 0, column = 2)
col2Ent.grid(row = 0, column = 3)
col3Lbl = Label(win, text = "Value 3: ")
col3Ent = Entry(win)
col3Ent.insert(0, values[2]) # Default is column 3's current value
col3Lbl.grid(row = 0, column = 4)
col3Ent.grid(row = 0, column = 5)
def UpdateThenDestroy():
if ConfirmEntry(treeView, col1Ent.get(), col2Ent.get(), col3Ent.get()):
win.destroy()
okButt = Button(win, text = "Ok")
okButt.bind("<Button-1>", lambda e: UpdateThenDestroy())
okButt.grid(row = 1, column = 4)
canButt = Button(win, text = "Cancel")
canButt.bind("<Button-1>", lambda c: win.destroy())
canButt.grid(row = 1, column = 5)
Sau đó, xác nhận thay đổi:
def ConfirmEntry(self, treeView, entry1, entry2, entry3):
####
# Whatever validation you need
####
# Grab the current index in the tree
currInd = treeView.index(treeView.focus())
# Remove it from the tree
DeleteCurrentEntry(treeView)
# Put it back in with the upated values
treeView.insert('', currInd, values = (entry1, entry2, entry3))
return True
Dưới đây là làm thế nào để xóa một mục:
def DeleteCurrentEntry(self, treeView):
curr = treeView.focus()
if '' == curr: return
treeView.delete(curr)
tôi đã phát triển một cách bấm vào một ô trong một khung nhìn tre và tạo một trường trên đầu ô được bấm để giá trị ô có thể được chỉnh sửa. Tuy nhiên, một trong những phương pháp treeview mà tôi sử dụng để kéo này chỉ hoạt động trên máy Mac của tôi, nhưng không phải trên Windows. Điều kỳ lạ là nó về mặt kỹ thuật không phải là ngay cả làm việc cho Mac, nhưng nó có. Bạn không liệt kê nền tảng của mình, nhưng nếu bạn đang sử dụng máy Mac (và sẽ không chạy mã trên Windows), hãy cho tôi biết và tôi sẽ đăng câu trả lời kèm theo chi tiết. –
Tôi đã làm như vậy và nó hoạt động cả linux và windows, tôi không có cơ hội dùng thử trên Mac. Tôi không phải làm cho văn bản có thể chỉnh sửa được, tôi đã làm cho tiện ích Entry chỉ đọc. Vì vậy, nếu 'giải pháp chỉ dành cho Mac' của bạn gặp sự cố khi hiển thị cửa sổ bật lên Nhập, có thể giải pháp của tôi có thể truyền cảm hứng cho bạn. Xem câu trả lời của tôi cho câu hỏi này cho ví dụ mã. – dakov
Tôi đã chạy vào những hạn chế tương tự, chủ yếu bằng cách sử dụng Treeview để bắt chước một bảng vì không có tiện ích bảng giống như trong tkinter/ttk. Nếu bạn không sử dụng Treeview làm "cây", bạn có thể thử tkintertable (https://code.google.com/p/tkintertable/). Về cơ bản, tính năng này cho phép tính năng bảng tính và tương đối hiện tại, được ghi lại tài liệu và khá giàu tính năng. – Fiver