2014-03-31 5 views
1

PanedWindow와 관련된 몇 가지 문제가 있습니다. 잘하지 못하고 조금 혼란 스럽습니다.PanedWindow에서 텍스트 위젯과 관련된 문제가 발생했습니다.

#!/usr/bin/env python 

import os 
from Tkinter import * 
import ttk 

root = Tk() 
root.geometry("%dx%d+0+0" % (1400,850)) 

mainpanedframeframe = PanedWindow(root,orient=HORIZONTAL) 
mainpanedframeframe.pack(fill=BOTH, expand=TRUE) 
auxframe1 = PanedWindow(mainpanedframeframe) 
auxframe2 = PanedWindow(mainpanedframeframe) 
mainpanedframeframe.add(auxframe1) 
mainpanedframeframe.add(auxframe2) 


# --------------- chtext ------------- 
chtext = Text(auxframe1, width=50) 
auxframe1.add(chtext) 
chyscrollbar=Scrollbar(auxframe1, orient=VERTICAL, command=chtext.yview) 
chtext["yscrollcommand"]=chyscrollbar.set 
chyscrollbar.pack(side=RIGHT,fill=Y) 

# --------------- configtext ------------- 
configtext = Text(auxframe2, width=150) 
auxframe2.add(configtext) 
yscrollbar=Scrollbar(auxframe2, orient=VERTICAL, command=configtext.yview) 
configtext["yscrollcommand"]=yscrollbar.set 
yscrollbar.pack(side=RIGHT, fill=Y) 

for i in range(50): 
    configtext.insert(INSERT,"test configtext \n\ntest 2\ntest 3\ntest 4\n\ntest x\n\n\n\n") 
    chtext.insert(INSERT,"test chtext \n\ntest 2\ntest 3\ntest 4\n\ntest x\n\n\n\n") 

#------------------------------ 
mainloop() 

작동하지만, 나는 그것을 피하는 방법을 잘 모릅니다, 시작, 1 위젯이 완전히 수축입니다 :이 예에서

나는 나란히 2 텍스트 위젯을 넣어하려고 해요 왼쪽으로.

두 번째 질문 - 더 많은 수수께끼 : 두 번째 텍스트 창이 단순히 텍스트를 상속하는 클래스이고 다른 것은 필요하지 않습니다 (더 복잡한 작업이 필요하지만이 예제에서와 같이 단순히 Text()를 호출하면 세로 스크롤 막대가 전혀 표시되지 않습니다.

#!/usr/bin/env python 

import os 
from Tkinter import * 
import ttk 

class MyText(Text): 
    def __init__(self, parent, *args, **kwargs): 
     Text.__init__(self, *args, **kwargs) 
     self.parent = parent 


root = Tk() 
root.geometry("%dx%d+0+0" % (1400,850)) 

mainpanedframeframe = PanedWindow(root,orient=HORIZONTAL) 
mainpanedframeframe.pack(fill=BOTH, expand=TRUE) 
auxframe1 = PanedWindow(mainpanedframeframe) 
auxframe2 = PanedWindow(mainpanedframeframe) 
mainpanedframeframe.add(auxframe1) 
mainpanedframeframe.add(auxframe2) 


# --------------- chtext ------------- 
chtext = Text(auxframe1, width=50) 
auxframe1.add(chtext) 
chyscrollbar=Scrollbar(auxframe1, orient=VERTICAL, command=chtext.yview) 
chtext["yscrollcommand"]=chyscrollbar.set 
chyscrollbar.pack(side=RIGHT,fill=Y) 

# --------------- configtext ------------- 
configtext = MyText(auxframe2, width=150) 
auxframe2.add(configtext) 
yscrollbar=Scrollbar(auxframe2, orient=VERTICAL, command=configtext.yview) 
configtext["yscrollcommand"]=yscrollbar.set 
yscrollbar.pack(side=RIGHT, fill=Y) 

for i in range(50): 
    configtext.insert(INSERT,"test configtext \n\ntest 2\ntest 3\ntest 4\n\ntest x\n\n\n\n") 
    chtext.insert(INSERT,"test chtext \n\ntest 2\ntest 3\ntest 4\n\ntest x\n\n\n\n") 

#------------------------------ 
mainloop() 

답변

2

질문 1 : Tk panedwidget은 하나 이상의 창에 대한 지오메트리 관리자입니다. 창으로 위젯을 추가 할 때 몇 가지 옵션을 지정하거나 나중에 paneconfigure 명령을 사용하여 위젯을 지정할 수 있습니다. 예 :

auxframe1.add(chtext, stretch="always") 
auxframe.paneconfigure(chtext, stretch="always") 
auxframe.panecget(chtext, "stretch") 

stretch="always"을 사용하면 초기 문제를 해결할 수 있습니다.

문서에서 "각 창에는 위젯 하나가 포함되어 있습니다 ..."라는 내용이 있습니다. panedwindow를 사용하여 텍스트 위젯을 관리하고 스크롤바를 동일한 창에 패킹하는 것입니다. 각 위젯에 (위의 chtext.wm_geometry() 및 chyscrollbar.wm_geometry()를 사용하여) 해당 지오메트리 관리자에 대해 묻는다면 스크롤 막대가 팩 기하도 관리자에 의해 관리되는 동안 텍스트 위젯은 panedwindow에 의해 관리됩니다. 이것은 좋은 계획이 아닙니다. 실제로 일어나는 일은 텍스트 위젯의 스크롤바 오버레이 부분이며 위젯의 가장자리를가립니다. 당신은 약간의 텍스트를 입력하고 창 크기를 줄이는 것을 관찰 할 수 있습니다. 텍스트가 위젯의 가장자리에 도달하면 기본적으로 줄 바꿈을 시작합니다. 스크롤 바를 패킹함으로써, 텍스트가 스크롤 바의 가장자리와 충돌하자마자 래핑하지 않고, 텍스트 위젯의 가장자리가 텍스트에 닿을 때만 래핑합니다. 이 문제를 해결하려면 텍스트와 스크롤 막대를 하나의 프레임에 넣고 해당 프레임을 창에 추가해야합니다.

나는이 두 번째 요점이 질문의 두 번째 부분에 누락 된 텍스트 위젯과 관련된 문제라고 생각합니다. 텍스트 위젯은 스크롤바를 가릴 수 있습니다. 두 개의 정보를 그리드하거나 팩하는 경우 프레임은 동일한 Geometry 관리자에 의해 관리되며 둘 다 주어진 공간의 양에 대해 혼란이 없습니다.

+0

감사합니다. panecget() 및 paneconfigure() 메소드에 대해 알지 못했습니다. – alessandro

+0

두 번째 사항에 관해서는, 나는 범인이 __init__에서 부모로서 존재한다는 것을 발견했습니다; 일단 그것을 제거하면 (그리고 self.parent = parent 너무) 기하학은 완벽했습니다. – alessandro

+0

ok - 제거 할 필요는 없지만 부모도 클래스 __init__ 함수로 전달되어야합니다. 그래서 부모의 위젯을 적절하게 지정할 수 있도록 MyText init fuction이'Text .__ init __ (self, parent, * args, ** kwargs)'를 호출하도록 수정했습니다. 그러나,'self.winfo_parent()'를 호출하여 위젯의 부모를 얻을 수 있기 때문에 부모를 녹음하는 것은 중복됩니다. – patthoyts

관련 문제