Python 文本窗口小部件的PanedWindow问题

Python 文本窗口小部件的PanedWindow问题,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我在使用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) mainpanedfra

我在使用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()
它可以工作,但我不知道如何避免,在开始时,第一个小部件完全缩小到左边

作为第二个问题——更令人困惑的是:如果第二个文本窗口是一个只继承文本而不继承其他内容的类(我需要做更复杂的事情,但在本例中,它只是对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()

对于问题1:Tk panedwidget是一个用于一个或多个窗格的几何体管理器。将小部件添加为窗格时,可以指定一些选项,也可以在以后使用命令指定这些选项。例如:

auxframe1.add(chtext, stretch="always")
auxframe.paneconfigure(chtext, stretch="always")
auxframe.panecget(chtext, "stretch")
使用
stretch=“always”
可以解决最初的问题

文档中提到的下一点是“每个窗格包含一个小部件,…”。您正在使用panedwindow管理文本小部件,然后还将滚动条打包到同一窗口中。如果您询问每个小部件的几何管理器(使用chtext.wm_geometry()和chycrollbar.wm_geometry()),则文本小部件由panedwindow管理,而滚动条由pack geometry manager管理。这不是一个好计划。实际上,滚动条覆盖了文本小部件的一部分,遮挡了小部件的边缘。当您输入一些文本并减小窗格的大小时,您可以进行观察。一旦文本到达小部件的边缘,默认情况下将开始包装。通过打包滚动条,这不会在文本与滚动条边缘碰撞时立即进行包装,而是仅在文本小部件的边缘碰到文本时进行包装。要解决这个问题,您应该将文本和滚动条放在一个框架中,然后将该框架添加到窗格中


我怀疑这第二点是问题第二部分缺少文本小部件的问题。您的文本小部件可能只是模糊了您的滚动条。如果网格化或将两个信息打包为一个帧,则它们都将由同一个几何体管理器管理,并且不会对每个信息的空间大小产生混淆。

谢谢。我不知道panecget()和paneconfigure()方法;一旦我移除了它(self.parent=parent),几何体就完美了——不知道为什么!!!好的-您不需要删除它,但是父级也应该传递给类init函数。因此,您可以保留它,但修改了MyText init函数以调用
Text.\uuuu init\uuuu(self、parent、*args、**kwargs)
,以便您可以正确指定父窗口小部件。但是,这样记录父项是多余的,因为您可以通过调用
self.winfo\u parent()