如何编写tkinter "scrolledtext "模块的代码

22 人关注

下面的代码产生了一个在文本部件中使用滚动条的丑陋但实用的例子,并导致了几个问题。注意:这是在一个windows盒子上用Python 3完成的。

  • 出现的滚动条是附在框架上的,虽然它可以滚动文本框的内容,但我希望它能附在文本部件本身。我一直无法做到这一点。

  • 有很多关于Tkinter模块 "scrolledtext "的参考资料,它应该是一个更好的为文本框添加滚动条的机制,但是,我没有找到任何关于如何导入和调用它的例子,而我又能够工作(可能需要一个例子)。

  • frame1 = tk.Frame(win,width=80, height=80,bg = '#808000')
    frame1.pack(fill='both', expand='yes')
    scrollbar = Scrollbar(frame1) 
    scrollbar.pack(side=RIGHT, fill=Y)
    editArea = Text(frame1, width=10, height=10, wrap=WORD, yscrollcommand=scrollbar.set)
    editArea.pack()    
    scrollbar.config(command=editArea.yview)
    editArea.place(x=10,y=30)
        
    python
    tkinter
    scrollbar
    Bill Waters
    Bill Waters
    发布于 2013-07-15
    2 个回答
    Peter Varo
    Peter Varo
    发布于 2013-07-15
    已采纳
    0 人赞同

    你是对的,你可以使用 ScrolledText 模块中的 tkinter.scrolledtext 小部件,像这样。

    import tkinter as tk
    import tkinter.scrolledtext as tkst
    win = tk.Tk()
    frame1 = tk.Frame(
        master = win,
        bg = '#808000'
    frame1.pack(fill='both', expand='yes')
    editArea = tkst.ScrolledText(
        master = frame1,
        wrap   = tk.WORD,
        width  = 20,
        height = 10
    # Don't use widget.place(), use pack or grid instead, since
    # They behave better on scaling the window -- and you don't
    # have to calculate it manually!
    editArea.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
    # Adding some text, to see if scroll is working as we expect it
    editArea.insert(tk.INSERT,
    Integer posuere erat a ante venenatis dapibus.
    Posuere velit aliquet.
    Aenean eu leo quam. Pellentesque ornare sem.
    Lacinia quam venenatis vestibulum.
    Nulla vitae elit libero, a pharetra augue.
    Cum sociis natoque penatibus et magnis dis.
    Parturient montes, nascetur ridiculus mus.
    win.mainloop()
    

    就这样吧。

    sol
    当我们事后改变editArea的文本时,如何更新它?
    Bryan Oakley
    Bryan Oakley
    发布于 2013-07-15
    0 人赞同

    虽然使用ScrolledText小组件可能会为你节省几行代码,但它并没有做任何你自己不能做的事情。自己做会有助于消除一些神秘感。

    实际上,你所做的一切几乎都是正确的。你所犯的错误是,你应该让你的文本部件完全填满它的容器,而不是只作为它的一小部分。

    标准的方法是这样的。

    container = tk.Frame(...)
    text = tk.Text(container, ...)
    scrollbar = tk.Scrollbar(container, ...)
    scrollbar.pack(side="right", fill="y")
    text.pack(side="left", fill="both", expand=True)
    

    这就是它的全部内容。现在,无论你的容器由于窗口大小的调整而变得多大,滚动条都会出现在文本部件上。然后,当你把它添加到你的整个GUI中时,你会把这一整组的容器、文本部件和滚动条作为一个单一的部件。

    请注意,你在这里也可以使用网格。如果你只有一个垂直滚动条,打包就比较容易。如果你既有水平滚动条又有垂直滚动条,网格就更有意义了。

    为了完成这个幻觉,你可以将文本部件的边框宽度设置为零,并将包含框架的边框宽度设置为1,浮雕为sunken,滚动条就会显得 "在 "文本部件中。

    这里有一个完整的工作例子,看起来与你的例子差不多。

    import Tkinter as tk
    win = tk.Tk()
    win.configure(background="#808000")
    frame1 = tk.Frame(win,width=80, height=80,bg = '#ffffff',
                      borderwidth=1, relief="sunken")
    scrollbar = tk.Scrollbar(frame1) 
    editArea = tk.Text(frame1, width=10, height=10, wrap="word",
                       yscrollcommand=scrollbar.set,
                       borderwidth=0, highlightthickness=0)
    scrollbar.config(command=editArea.yview)
    scrollbar.pack(side="right", fill="y")
    editArea.pack(side="left", fill="both", expand=True)
    frame1.place(x=10,y=30)