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