PanedWindow与文本小部件有关

时间:2014-03-31 07:54:25

标签: 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)
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的类而没有别的东西(我需要做更复杂的事情,但就像它在这个例子中所说的那样它只是一个调用到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 个答案:

答案 0 :(得分: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()),则文本窗口小部件由窗口窗口管理,而滚动条由包几何管理器管理。这不是一个好方案。实际发生的是滚动条覆盖文本小部件的一部分,遮住小部件的边缘。您可以观察到这是您输入一些文本并减小窗格的大小。一旦文本到达小部件的边缘,它将默认开始包装。通过打包滚动条,只要文本与滚动条的边缘碰撞,但只有当文本小部件的边缘碰到文本时,才会换行。要解决此问题,您应该将文本和滚动条放在一个框架中,然后将该框架添加到窗格中。

我怀疑第二点是问题第二部分中缺少文本小部件的问题。您的文本小部件可能只是模糊滚动条。如果您将两个信息网格化或打包一帧,那么它们将由同一个几何管理器管理,并且不会混淆每个信息将给出多少空间。