【问题标题】:How to code the tkinter "scrolledtext" module如何编码 tkinter “scrolledtext” 模块
【发布时间】:2013-07-13 11:49:49
【问题描述】:

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

  1. 出现的滚动条附加到框架上,虽然它滚动文本框的内容,但我更希望它附加到文本小部件本身。我一直无法做到这一点。

  2. 有许多对名为“scrolledtext”的 Tkinter 模块的引用,它应该是向文本框添加滚动条的更好机制,但我没有找到任何关于如何导入和调用它的示例我能够开始工作(可能需要一个例子)。


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


    【解决方案1】:

    你是对的,你可以使用来自tkinter.scrolledtext 模块的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()
    

    你去吧:

    【讨论】:

    • editArea的文本修改后如何更新?
    【解决方案2】:

    虽然使用 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,并带有凹陷的浮雕,滚动条将出现在文本控件的“内部”。

    这是一个完整的工作示例,看起来或多或少像您的示例:

    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)
    
    win.mainloop()
    

    我个人不建议进行全局导入,也不建议使用 place,但我希望尽可能接近您的原件。

    【讨论】:

    • 相对于其他答案的另一个优势是您可以避免使用import tkinter.scrolledtext as tkst。我有 15 分钟的 cptouch 命令填充我的文本小部件。它会自动滚动还是需要某种.see() 方法,就像在 tk.Treeview 中一样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多