2014-08-29 3 views
-1

그리드에 두 개의 프레임이있는 문제가 있습니다. 하나는 상단에, 하나는 하단에 있습니다. 둘 다 프레임에 캔버스가 있습니다. 아래쪽 캔버스에는 스크롤바가 있습니다. 유일한 문제는 내가 아래로 스크롤하면 그 캔버스의 내용 (따라서 프레임)이 상단 프레임으로 스크롤된다는 것입니다. 이는 분명히 이상적이지 않습니다.Tkinter - 다른 프레임으로 프레임 스크롤?

각각의 너비와 높이를 제한하지 않으려 고 시도했습니다. 자체 프레임을 떠나지 않고 프레임에서 내용이 "사라지게"할 수 있는지 궁금합니다. 웹에서 스크롤되는 모든 콘텐츠가이 작업을 수행하므로 방법이 있어야합니다.

내 코드는 다음과 같습니다. "test"는 위쪽 캔버스이고 "testCanvas"는 아래쪽 프레임에 만들어진 아래쪽 캔버스입니다. 보시다시피, "testCanvas"는 "test"로 스크롤됩니다. 나는 tutorialspoint, effbot 및 stackoverflow를 잘 보았지만 꽤 이해할 수는 없다.

#!/usr/bin/python 

from struct import * 
import array 
import tkinter 
from tkinter import * 
from tkinter import ttk 

root = Tk() 

frame = Frame() 
frame.pack() 

root.minsize(width=230, height=70) 
root.maxsize(width=1070, height=500) 

IDlabel = ttk.Label(frame, text="Enter ID:") 
IDlabel.pack() 

IDentry = ttk.Entry(frame) 
IDentry.pack() 

def close(): 
    root.quit() 

def submit(event): 

    userIDentry = IDentry.get() 

    if userIDentry == '': 
     exit() 

    headerFrame = Frame(root, width=5, height=5) 
    headerFrame.grid(row=0, column=0) 

    channelFrame = Frame(root, width=720, height=400) 
    channelFrame.grid(row=1, column=0) 
    channelFrame.pack_propagate(0) 
    frame.destroy() 

    additionalFrame = Frame(root) 

    test = Canvas(headerFrame) 

    testCanvas = Canvas(channelFrame) 

    testCanvas.create_window((3,0), window=additionalFrame, anchor=NW) 

    vbar = Scrollbar(channelFrame, orient=VERTICAL) 
    vbar.pack(side=RIGHT, fill=Y) 
    vbar.config(command=testCanvas.yview) 

    sampleOutput = ttk.Label(test, text="Sample") 
    sampleOutput.grid(row=1, column=1) 

    secondFrameOutput = ttk.Label(additionalFrame, text="My scrolling behavior is off", font="Verdana 10 bold") 
    secondFrameOutput.grid(row=0, column=1) 

    closeButton = ttk.Button(additionalFrame, text="Close", command=close) 
    closeButton.grid(row=1, column=2) 

    testCanvas.config(width=2200, height=600) 
    testCanvas.config(yscrollcommand=vbar.set) 
    testCanvas.pack() 

    testCanvas.config(scrollregion=(0,0,700,1145)) 

    test.config(width=50, height=50) 
    test.pack() 

root.bind('<Return>', submit) 

submitButton = ttk.Button(frame, text="Submit", command=submit) 
submitButton.bind('<Button-1>', submit) 
submitButton.pack() 

root.mainloop() 
+1

귀하의 질문은 명확하지 않습니다. 두 프레임이 있다고하지만, ""testCanvas는 "아래쪽 프레임"이라고 말합니다. 프레임이나 캔버스에 대해 이야기하고 있습니까? –

+0

죄송합니다, Bryan. 나는 물건이 섞여있어. 여기에 필요한 변경을하겠습니다. 저는 testCanvas가 아래쪽 프레임에 인스턴스화 된 캔버스라고 말하고자합니다. 그 밖의 무엇이 당신을 혼동시키는 찾아내는가? – KlayT

답변

1

솔직히 말해서 나는 모든 코드를 버리고 다시 시작해야한다고 생각합니다. 너무 많은 잘못이 있습니다 - 당신은 너무 많은 알려지지 않은 변수로 방정식을 풀려고합니다.

예를 들어, 루트 창에 프레임을 만들고 패킹 한 다음 나중에 프레임을 파괴하고 그리드를 사용하여 다른 위젯을 추가합니다. 이 작업을 수행하는 것이 가능하지만 코드가하는 일을 파악하는 것은 매우 어렵습니다. 그게 문제의 일부입니까? 그것은 완전히 관련이 없습니까? 어떻게 알았어?

또한 5x5 픽셀의 헤더 프레임을 만듭니다. 왜 그렇게 작습니까? 코드 위쪽에 캔버스를 작성한 다음 코드 맨 아래에 크기를 구성합니다. 레이블을 만들어 캔버스에 포장하십시오. 캔바스에 무엇인가를 포장하는 것도 가능하지만 생각하는대로 할 수는 없습니다.

단일 프레임을 만드는 함수 (또는 클래스)로 시작하십시오. 초기 입력 위젯을 무시하고 버튼을 프레임에 초점을 맞 춥니 다. 이 함수에서 위쪽 및 아래쪽 프레임을 추가하십시오. 그만 두어 그 둘 모두가 원하는 위치에 나타나고 원하는 크기로 나타나는지 확인하십시오. 개발하는 동안 서로 다른 배경색을주고, 너비와 높이를 줄 수도 있습니다. 방정식에서 변수가 하나 더 적어 지도록 작업을 수행하십시오. 창 크기를 조정할 때 제대로 작동하는지 확인하십시오.

다음에는 하나의 캔버스 만 추가하고 해당 캔버스에 대한 스크롤 막대를 추가하십시오. 그만하고 프레임이 제대로 작동하는지 확인하십시오. 캔버스에 아무 것도 없기 때문에 스크롤바가 스크롤되지 않습니다.하지만 아직 중요하지 않습니다.

위젯의 나머지 부분에서도 이와 같이 계속하십시오. 각 위젯이 올바르게 작동 할 때까지 진행하지 마십시오.

GUI를 만들려면 체계적이어야합니다. 한 번에 6 개의 위젯을 저글링하기 시작하지 마십시오. 하나 또는 둘로 시작하여 작동 시키거나 하나 더 추가하는 등의 작업을 수행하십시오.

+0

루트 윈도우의 프레임이 파괴되면서 사용자가 ID를 입력하고 제출을 누른 다음 동일한 창에 새 정보가 채워지 길 원했습니다. 나는 그것이 올바른 생각이지만 빈약 한 실행이라고 생각합니다. 이것에 대한 더 좋은 방법이 있습니까? 명백한 불일치에 관해서는, 나는 구체적인 디자인 패턴없이 너무 많은 것을 실험하고있었습니다. 이제 저는 그것을 봅니다. 지금까지 조언 해 주셔서 감사드립니다. – KlayT

관련 문제