Python Tkinter内部文本小部件中的滚动条
我对Tkinter中文本小部件内的滚动条设置有问题。我知道,最好使用网格来定位小部件,但我想用指定的高度和宽度将小部件设置在绝对位置(GUI图片上的x,y-红点) 我的代码:Python Tkinter内部文本小部件中的滚动条,python,python-2.7,tkinter,scrollbar,Python,Python 2.7,Tkinter,Scrollbar,我对Tkinter中文本小部件内的滚动条设置有问题。我知道,最好使用网格来定位小部件,但我想用指定的高度和宽度将小部件设置在绝对位置(GUI图片上的x,y-红点) 我的代码: from Tkinter import * from ttk import * class NotebookDemo(Frame): def __init__(self): Frame.__init__(self) self.pack(expand=1,
from Tkinter import *
from ttk import *
class NotebookDemo(Frame):
def __init__(self):
Frame.__init__(self)
self.pack(expand=1, fill=BOTH)
self.master.title('Sample')
self.master.geometry("650x550+100+50")
self._initUI()
def _initUI(self):
self._createPanel()
def _createPanel(self):
# create frame inside top level frame
panel = Frame(self)
panel.pack(side=TOP, fill=BOTH, expand=1)
# create the notebook
nb = Notebook(panel)
nb.pack(fill=BOTH, expand=1, padx=2, pady=3)
self._FirstTab(nb)
def _FirstTab(self, nb):
# frame to hold content
frame = Frame(nb)
#textbox
txtOutput = Text(frame, wrap = NONE, height = 17, width = 70)
txtOutput.place(x=10, y=75)
#button
btnStart = Button(frame, text = 'Start', underline=0)
btnStart.place(x=220, y=380)
#scrollbar
#vscroll = Scrollbar(frame, orient=VERTICAL, command=txtOutput.yview)
#txtOutput['yscroll'] = vscroll.set
#vscroll.pack(side=RIGHT, fill=Y)
#txtOutput.pack(fill=BOTH, expand=Y)
#add to notebook (underline = index for short-cut character)
nb.add(frame, text='TAB 1', underline=0, padding=2)
if __name__ == '__main__':
app = NotebookDemo()
app.mainloop()
如果我取消注释这部分代码(设置滚动条):
我的滚动条位于所有窗口内,而不是文本框内:
但我当然希望在文本框小部件(黑色边框)中有滚动条。
如果我使用pack函数创建文本框:
txtOutput.pack(fill=BOTH, expand=Y)
文本小部件填充整个窗口…:
我真的不知道如何解决这个问题。
任何帮助都将不胜感激。
谢谢大家!
编辑:
当然,我也可以在滚动条上使用place方法,但我不能更改它们的长度,因为它并没有属性length
vscroll.place(x=573, y=75)
不同的几何体管理器,如
place
和pack
不能很好地混合。我为您提供了四种选择:
使用父帧
创建一个新的框架
,将其放置在与文本框完全相同的位置。在此框架中,您可以使用另一个几何体管理器(我更喜欢pack
)使布局显示为您想要的样子
使用滚动文本
使用ScrolledText
Tkinter模块以预先制作的形式提供上述解决方案。请注意,此小部件未使用ttk
,因此滚动条样式并不真正适合操作系统的外观。只需使用import ScrolledText
并将代码中的Text
创建替换为ScrolledText.ScrolledText(…)
使用滚动条的位置
如果对文本小部件使用place
,则对滚动条也使用place
place
提供了一些选项,允许您将一个小部件相对于另一个小部件放置在位置和大小上(即:您可以将滚动条沿文本小部件的右边缘放置,并使其与文本小部件一样高)
不要使用这个地方
就这么简单。使用
grid
或pack
,除非您真的需要使用place
虽然我很少推荐place
,但当您利用配置选项时,它非常强大。例如,您可以在中使用来指定此小部件相对于的位置。可以使用relx
指定相对x坐标,也可以使用relheight
指定高度
在您的情况下,您可以尝试以下方法:
vscroll.place(in_=txtOutput, relx=1.0, relheight=1.0, bordermode="outside")
如果您希望看到滚动条嵌入到文本小部件中的错觉,就像某些平台上常见的(或曾经常见的)一样,我建议将文本小部件和滚动条放在一个框架中。您可以使用pack
将小部件放在框架中,然后继续使用place
将组合放在您想要的任何位置
例如:
txtFrame = Frame(frame, borderwidth=1, relief="sunken")
txtOutput = Text(txtFrame, wrap = NONE, height = 17, width = 70, borderwidth=0)
vscroll = Scrollbar(txtFrame, orient=VERTICAL, command=txtOutput.yview)
txtOutput['yscroll'] = vscroll.set
vscroll.pack(side="right", fill="y")
txtOutput.pack(side="left", fill="both", expand=True)
txtFrame.place(x=10, y=75)
另一个选项是继续使用place
,并对滚动条使用place
。@BryanOakley当然,我错过了明显的。。。请随意在中编辑此选项,我对此不太了解。感谢您的选项:)我将选择其中一个并尝试实施。如果您坚持对文本小部件使用place
,为什么您不将其用于滚动条?您是否知道place
有许多选项,包括相对于另一个小部件放置一个小部件的选项?如果你知道它们,你试过了吗?当然我也可以在滚动条上使用place方法,但我不能更改它们的长度,因为它没有length属性(或者可能有)。我编辑了我的帖子和附加图像。您可以使用place
设置元素的宽度和高度。例如,height
属性将高度设置为绝对高度,relheight
属性设置相对于其他小部件的高度。您应该花一些时间阅读文档。虽然我很少推荐place
,但当您使用它的所有功能时,它会非常强大。根据这个规范,它只有宽度属性。如果我尝试使用height属性,我会得到AttributeError:Scrollbar实例没有属性'height'或Tcl错误:未知选项“-height”。。你误解我了。这些属性是为place
设置的。我已经找到了,再次感谢!!正是我需要的。
txtFrame = Frame(frame, borderwidth=1, relief="sunken")
txtOutput = Text(txtFrame, wrap = NONE, height = 17, width = 70, borderwidth=0)
vscroll = Scrollbar(txtFrame, orient=VERTICAL, command=txtOutput.yview)
txtOutput['yscroll'] = vscroll.set
vscroll.pack(side="right", fill="y")
txtOutput.pack(side="left", fill="both", expand=True)
txtFrame.place(x=10, y=75)