tkinter Treeview 칼럼에 콤보박스 텍스트박스 추가 가능한가요?

안녕하세요.
파이썬 공부 중인 파린이입니다.
이미지와 같이 E, F 칼럼에 콤보박스/텍스트박스를 추가하고 싶습니다.
기본 데이터는 더 많을 수도 있으며, 칼럼 수는 고정입니다.
아무리 구글링해도 답을 찾을 수가 없습니다.
불가능한 것인지요?
감사합니다.

Imgur

import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk() 

window.geometry("400x200+50+50") 
window.title("창 타이틀") 

frame = tk.Frame(window) 
frame.pack() 

tree = ttk.Treeview(frame, columns=(1, 2, 3), height=5, show="headings") 
tree.pack(side='left')

tree.heading(1, text="A") 
tree.heading(2, text="B") 
tree.heading(3, text="C")

tree.column(1, width=100) 
tree.column(2, width=100) 
tree.column(3, width=100) 

scroll = ttk.Scrollbar(frame, orient="vertical", command=tree.yview) 
scroll.pack(side='right', fill='y') 
tree.configure(yscrollcommand=scroll.set)

data = [["1", "2", "3"],
        ["4", "5", "6"],
        ["7", "8", "9"],
        ["10", "11", "12"],
        ["13", "14", "15"],
        ["16", "17", "18"]]

for val in data:
    tree.insert('', 'end', values=(val[0], val[1], val[2]))

label = tk.Label(window, text="default text") 
label.pack()

def click_item(event):
    selectedItem = tree.focus() 
    getValue = tree.item(selectedItem).get('values') 
    label.configure(text=getValue)

tree.bind('<ButtonRelease-1>', click_item) 

window.mainloop()

sungdongjea0 1169

2021년 9월 6일 10:03 오후

목록으로
2개의 답변이 있습니다. 1 / 1 Page

TreeView 에는 다른 위젯(콤보등)을 포함할 수 없는것 같습니다.

https://stackoverflow.com/questions/16755176/tkinter-insert-a-combobox-inside-a-treeview-widget

박응용

2021년 9월 6일 11:45 오후

많이 늦었지만 바인딩 이벤트와 위젯 위에 위젯을 그리는 편법으로 추가 가능하긴 합니다.
아래 예제는 Entry 박스 생성 예제 입니다.

self.Tr.bind("",self.doubleclick)

def doubleclick(self, event):        
            #마우스 위치 감지
    if self.Tr.identify_row(event.y) == '' or self.Tr.identify_column(event.x) not in ['#2','#3'] :
        return

    region_clicked = self.Tr.identify_region(event.x, event.y)
    column = self.Tr.identify_column(event.x)
    row = self.Tr.identify_row(event.y)

    selectIid = self.Tr.focus()
    selectValues = selfTr.item(selectIid)

            #마우스가 위치한 부분의 셀 크기 확인
    columnIndex = int(column[1:]) - 1
    columnBox = self.Tr.bbox(selectIid,column)

            #확인 된 셀크기 기준으로 위에 새로운 임시 위젯 생성
    entryEdit = Entry(self.INFO, width = columnBox[2])
    entryEdit.place(x=columnBox[0],y=columnBox[1],w=columnBox[2],h=columnBox[3])
    entryEdit.editingColumnIndex = columnIndex
    entryEdit.editingRowIndex = row
    entryEdit.editingItemIid = selectIid
    entryEdit.insert(0,selectValues.get("values")[columnIndex])
    entryEdit.select_range(0,END)
    entryEdit.focus()

            #임시 생성된 위젯에서 키 바인딩
    entryEdit.bind("<FocusOut>", self.on_focus_out)
    entryEdit.bind("<Return>",self.on_enter_pressed)
    entryEdit.bind("<Tab>",self.on_enter_pressed)

def on_focus_out(self, event):
    event.widget.destroy()

def on_enter_pressed(self, event):
    new_text = event.widget.get()

    selectIid = event.widget.editingItemIid
    columnIndex = event.widget.editingColumnIndex

    currentValues = self.Tr.item(selectIid).get("values")
    currentValues[columnIndex] = new_text
    self.Tr.item(selectIid,values=currentValues)
    event.widget.destroy()

cloud81j

2023년 6월 29일 8:57 오전