【问题标题】:Scrollbar to scroll Text widget, using Grid layout, in Tkinter滚动条滚动文本小部件,使用网格布局,在 Tkinter
【发布时间】:2015-08-11 13:59:22
【问题描述】:

我正在尝试使用 Tkinter 中的网格布局管理器来创建一个对话框。 我希望底部的文本区域有一个滚动条。不幸的是,我无法弄清楚如何使滚动条与其旁边的 Text 小部件具有相同的高度。下面的示例显示滚动条的位置正确但大小错误(仅约为 Text 小部件高度的 10%)。

from tkinter import *

class queryrunner(Tk):
    def __init__(self,parent):
        Tk.__init__(self,parent)
        self.parent = parent
        self.minsize(width=800,height=500)
        self.initialize()

    def initialize(self):
        self.grid_columnconfigure(2,weight=1)
        self.grid_columnconfigure(3,weight=1)
        self.grid_columnconfigure(6,weight=2)
        self.grid_rowconfigure(0,weight=1)
        self.grid_rowconfigure(1,weight=1)
        self.grid_rowconfigure(2,weight=1)
        self.grid_rowconfigure(3,weight=1)
        self.grid_rowconfigure(4,weight=1)
        # BUCKET AND N1QL LABEL + INPUT PAIRS: 
        self.label = Label(self,text="Bucket", width=10, anchor="w")
        self.label.grid(column=0,row=0,columnspan=1,sticky='W')
        self.entry = Entry(self);
        self.entry.grid(column=1,row=0, columnspan=3, sticky='EW')
        self.entry.insert(0, "couchbase://couchbase1.mycompany.com/beer-sample" )
        # EXECUTE N1QL QUERY AGAINST BUCKET WHEN BUTTON CLICKED:
        self.button = Button(self,text="Go",width=20)
        self.button.grid(column=6,row=0)
        self.label2 = Label(self,text="N1QL", anchor="w")
        self.label2.grid(column=0,row=1,columnspan=1,sticky='W')
        self.entry2 = Text(self,height=5);
        self.entry2.grid(column=1,row=1, columnspan=3, rowspan=1, sticky='W')

        self.label3 = Label(self,text="Output:", width=50,anchor="w")
        self.label3.grid(column=0,row=4,columnspan=5,sticky='W')
        self.entry3 = Text(self,height=18)
        self.entry3.grid(column=1,row=5, columnspan=5, rowspan=1, sticky='W')
        # PROBLEM: GET SCROLLBAR TO BE THE RIGHT SIZE (IT'S NOT THE SIZE OF THE THING ITS BESIDE)
        self.scrollbar = Scrollbar(self) # height= not permitted here!
        self.entry3.config(yscrollcommand= self.scrollbar.set)
        self.scrollbar.config(command= self.entry3.yview)
        self.grid()
        self.scrollbar.grid(column=6, row=5, rowspan=2,  sticky='W')


if __name__ == "__main__":
    app = queryrunner(None)
    #font.nametofont('TkDefaultFont').configure(size = 10 )
    app.title('Couchbase N1QL Query Runner')
    app.mainloop()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    在滚动条网格调用的粘性选项中添加北和南,使滚动条在垂直方向拉伸。

    self.scrollbar.grid(column=6, row=5, rowspan=2,  sticky=N+S+W)
    

    【讨论】:

    • sticky='NS' 将其垂直拉伸并将其放在行的中间,sticky='NSW' 也将其粘贴到行的左侧,因此在我看来看起来更好的文本。
    【解决方案2】:

    您只能在容器的每个子窗口小部件上使用一个几何管理器,但如果子窗口小部件本身就是一个容器,您可以为它的孩子使用任何您喜欢的几何管理器。这意味着我们可以将Framepack() 以及EntryScrollbar 放入其中,使用fill='y' 参数使Scrollbar 填充可用空间。

    改变这个:

    self.entry3 = Text(self,height=18)
    self.entry3.grid(column=1,row=5, columnspan=5, rowspan=1, sticky='W')
    # PROBLEM: GET SCROLLBAR TO BE THE RIGHT SIZE (IT'S NOT THE SIZE OF THE THING ITS BESIDE)
    self.scrollbar = Scrollbar(self) # height= not permitted here!
    self.entry3.config(yscrollcommand= self.scrollbar.set)
    self.scrollbar.config(command= self.entry3.yview)
    self.grid()
    self.scrollbar.grid(column=6, row=5, rowspan=2,  sticky='W')
    

    到这里:

    self.frame = Frame(self)
    self.frame.grid(column=1,row=5, columnspan=6, rowspan=1, sticky='W')
    self.entry3 = Text(self.frame,height=18)
    self.entry3.pack(side='left', fill='both', expand=True)
    # PROBLEM: SOLVED
    self.scrollbar = Scrollbar(self.frame) # height= not permitted here!
    self.entry3.config(yscrollcommand= self.scrollbar.set)
    self.scrollbar.config(command= self.entry3.yview)
    self.grid()
    self.scrollbar.pack(side='right', fill='y')
    

    【讨论】:

    • 这可行,但在我的情况下,做粘性选项更简单。
    【解决方案3】:

    有 ScrolledText 模块。

    如果您使用的是 Anaconda python 发行版,那么在conda 命令行中执行:

     conda install ScrolledText
    

    然后在您的 .py 文件中导入模块(如果是 python 3 及更高版本)

     from tkinter.scrolledtext import ScrolledText
    

    如果是 python 2.7 那么

     import ScrolledText
    

    然后你在 python 3 中像普通的 Text 小部件一样调用它:

    self.textBox = ScrolledText(self,borderwidth=3,relief="sunken")

    它是一个复合小部件(文本和滚动条)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2017-09-29
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多