프레임 내에 그리드로 배치 된 레이블을 사용하여 테이블을 만들고 있습니다. 이 프레임을 스크롤 가능한 캔버스에 포함하고 싶습니다. 세로 스크롤 기능을 유지하면서 가로 공간을 채우기 위해 레이블을 확장하고 싶습니다. 내가하려는 작업을 보려면 여기에 내 코드가 있습니다.
class ScrollableTable(Frame):
def __init__(self, parent, rows=4, columns=5):
self.rows = rows
self.columns = columns
Frame.__init__(self, parent, borderwidth=0, background='green')
self.canvas = Canvas(self, borderwidth=0)
self.frame = Frame(self.canvas, borderwidth=0, background='black')
self.vsb = Scrollbar(parent, orient=VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.canvas.pack(side=LEFT, fill=X, expand=TRUE)
# This is where I fix the height I want this window to take up
self.canvas.configure(yscrollcommand=self.vsb.set, width=720, height=80)
self.height = self.canvas.winfo_reqheight()
self.width = self.canvas.winfo_reqwidth()
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = Label(self.frame, text="N/A",
borderwidth=0, width=5, anchor=W, justify=LEFT)
label.grid(row=row, column=column, sticky='NESW', padx=0.5, pady=0.5)
current_row.append(label)
self._widgets.append(current_row)
self.canvas.create_window((0,0), window=self.frame, anchor='w', tags=self.frame)
self.frame.bind("<Configure>", self.OnFrameConfigure)
self.canvas.bind("<Configure>", self.onResize)
#self.frame.pack(side=LEFT, fill=X, expand=True)
self.vsb.pack(side=RIGHT, fill=Y, expand=True)
위의 코드에서 두 번째에서 마지막 줄까지 주석 처리됩니다. 주석 처리되면 공간을 채우기 위해 확장되지 않는 테이블이 표시되지만 스크롤바는 작동합니다. 그러나 해당 줄의 주석 처리를 제거하고 frame.pack 접근 방식을 사용하면 테이블이 가로 공간을 채우지 만 스크롤 기능이 손실됩니다. 스크롤 기능을 잃어 버리는 이유-포인터가있는 이유는 무엇입니까?
프레임을 호출 할 필요가 없으므로pack
프레임 너비를 수동으로 관리해야합니다. 일반적으로 <Configure>
캔버스 의 이벤트에 바인딩하여이를 수행합니다 . 바인딩 된 함수에서 캔버스의 너비를 가져온 다음 itemconfigure
메서드를 사용 하여 창 개체의 너비를 설정합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다