2012-03-05 4 views
5

데이터베이스의 내용을 Tkinter 위젯에 출력하려고합니다. 데이터베이스에는 가로 및 세로 스크롤 막대를 모두 활성화해야하는 곳에 충분한 행과 열이 있지만 가로 및 세로 스크롤을 동시에 수행하는 데 어려움을 겪고 있습니다. 내가 사용하는 Tkinter를 위젯에 대한 불가지론 모르지만, 여기에 내 현재 구현 :Tkinter 위젯의 수직 및 수평 스크롤 막대

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) # scrolling works in x but not y 
self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) # scrolling works in y but not x 
: 나는 캔버스를 포장하는 방법, 난 단지에 따라 한 방향으로 작동하는 스크롤을 얻을 수있는이 구현에서

# Create root 
self.root = Tk() 
self.root.geometry('1000x500+0+0') 

# Create canvas 
self.canvas = Canvas(self.root) 
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 

# Create scrollbars 
self.xscrollbar = Scrollbar(self.root, orient=HORIZONTAL, command=self.canvas.xview) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar = Scrollbar(self.root, orient=VERTICAL, command=self.canvas.yview) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

# Attach canvas to scrollbars 
self.canvas.configure(xscrollcommand=self.xscrollbar.set) 
self.canvas.configure(yscrollcommand=self.yscrollbar.set) 

# Create frame inside canvas 
self.frame = Frame(self.canvas) 
self.canvas.create_window((0,0), window=self.frame, anchor=NW) 
self.frame.bind('<Configure>', self.set_scrollregion) 

# Write db contents to canvas 
self.print_dbcontents() 

# Invoke main loop 
self.root.mainloop() 

def set_scrollregion(self, event): 
    self.canvas.configure(scrollregion=self.canvas.bbox('all')) 

동시에 작동하려면 가로 및 세로 스크롤을 사용하거나 대체 솔루션을 찾아야합니다.

+0

[스크롤링 예제] (http://www.tkdocs.com/tutorial/canvas.html#scrolling)는 예상대로 작동합니다 (가져 오기는 Python 2.x에서 수정해야합니다). – jfs

답변

8

스크롤 막대가 작동하지 않도록하는 코드가 표시되지 않습니다. 스크롤바 중 하나가 예상 한 위치에 표시되지 않도록하는 문제가 있습니다 (기존 위치에 표시 될 것으로 예상한다고 가정). 그것이 당신이 그들이 동시에 일하기를 원한다고 말하는 유청을 의미합니까?

레이아웃은 다음 코드를 사용하여 다음과 같은 순서로 이루어집니다

: 모든 방법으로 모든 방법 왼쪽에서 첫 번째 줄은 위젯의 전체 상단을 채우기 위해 캔버스의 원인

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

그건 오른쪽으로. 나중에 yscrollbar를 오른쪽에 놓으면 캔버스가 상단을 채우고 난 후 의 왼쪽 공간으로 이동한다는 의미입니다. 캔버스가 맨 위에 채워지기 때문에 오른쪽 아래 공간 만 남았습니다. 따라서 스크롤 막대는 캔버스 아래의 가로 스크롤 막대 높이에 대한 작은 위젯으로 표시됩니다.

빨리 해결하면 수직 스크롤바를 먼저 패킹 한 다음 수평을 맞추고 을 누른 다음 캔버스를합니다. 귀하의 "주요"위젯은 항상 당신이 포장/그리드 마지막 물건 중 하나가되어야합니다. 하나는 원하는 효과를 얻으려면이 경우에해야 할 분명한 이유 때문이며 크기 조정 동작이 올바르게 이루어지기 때문입니다. 나는이 대답에서 이유를 설명하기 위해 주제를 벗어나므로 자세한 내용은 this answer on stackoverflow을 읽으십시오.

둘째, 스크롤바를 사용하여 작업 할 때 전문적인 모양을 원하면 그리드를 사용하는 것이 가장 좋습니다. pack을 사용하면 스크롤바는 일치하는 구석에 속성을 정렬하지 않습니다. 마지막으로

|| -or-  || 
====   ==|| 

: 당신이 팩을 사용하는 경우가 이들 중 하나처럼 보일 것이다, 그러나

|| 
== 

: 당신은 그들을 오른쪽 하단에 작은 빈 공간, 같이 할 이 아닌import *으로 보내 주시면 문제가 발생할 수 있습니다. 대신, import Tkinter as tk을 수행하고 모든 tk 명령 앞에 "tk"를 붙이는 습관을 들여야합니다. (예 : tk.Canvas 등). 동일한 UI에서 ttk와 tkinter 위젯을 처음으로 혼합하려고 할 때 이것이 중요한 이유를 알 수 있습니다.하지만 다른 패키지에서도 "가져 오기 *"를하면 다른 곳에서도 문제가 발생할 수 있습니다. 또한 tk 기능을 사용할 때와 다른 패키지의 기능을 사용하는 경우에도 이러한 방식으로 분명합니다.

관련 문제