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()
这样做是可以的,但我不知道怎么才能让第一个文本框一开始不要完全缩到左边。
还有第二个问题,更让我困惑的是:如果第二个文本框是一个简单继承自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 个回答
关于第一个问题: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,它们都会由同一个几何管理器管理,这样就不会出现各自占用空间的混淆了。