PanedWindow与文本小部件的问题

1 投票
1 回答
813 浏览
提问于 2025-04-18 00:38

我在使用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 个回答

2

关于第一个问题:Tk的panedwidget是一个用来管理一个或多个面板的工具。当你把一个小部件(widget)添加为面板时,可以设置一些选项,或者之后再用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管理的,而滚动条是由pack几何管理器管理的。这种方式并不好。实际上,滚动条会覆盖你文本小部件的一部分,遮住小部件的边缘。如果你输入一些文本并缩小面板的大小,你会观察到这种情况。一旦文本碰到小部件的边缘,它默认会开始换行。但由于滚动条的存在,文本并不会在碰到滚动条的边缘时立即换行,而是等到文本小部件的边缘碰到文本时才换行。为了解决这个问题,你应该把文本和滚动条放到一个框架(Frame)里,然后把这个框架添加到面板中。

我怀疑第二个要点就是你在问题第二部分中缺失文本小部件的原因。你的文本小部件可能正好被滚动条遮住了。如果你把这两个小部件放到一个框架里,无论是用grid还是pack,它们都会由同一个几何管理器管理,这样就不会出现各自占用空间的混淆了。

撰写回答