Python Tkinter内部文本小部件中的滚动条

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,

我对Tkinter中文本小部件内的滚动条设置有问题。我知道,最好使用网格来定位小部件,但我想用指定的高度和宽度将小部件设置在绝对位置(GUI图片上的x,y-红点)

我的代码:

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)