水平滚动条在Tkinter中不起作用

时间:2012-09-12 12:51:37

标签: python text tkinter scrollbar

我想基于tkinter创建一个GUI程序。其中一个小部件是Text。我想在其中添加一个水平滚动条,但它不起作用。

我在哪里弄错了?

from Tkinter import *
import tkFont


class DpWin(object):

    def run(self):
        root=Tk()
        root.geometry('768x612')
        title='dp'
        root.title(title)

        xscrollbar = Scrollbar(root, orient=HORIZONTAL)
        xscrollbar.pack(side=BOTTOM, fill=X)

        yscrollbar = Scrollbar(root)
        yscrollbar.pack(side=RIGHT, fill=Y)

        text = Text(root,xscrollcommand=xscrollbar.set,yscrollcommand=yscrollbar.set)
        text.pack()

        xscrollbar.config(command=text.xview)
        yscrollbar.config(command=text.yview)
        text.insert(END,'a'*999)
        mainloop()

    def start(self):
        self.b_start.config(state=DISABLED)
        self.b_stop.config(state=ACTIVE)

    def stop(self):
        self.b_stop.config(state=DISABLED)
        self.b_start.config(state=ACTIVE)


if __name__=='__main__':
    win=DpWin()
    win.run()

2 个答案:

答案 0 :(得分:7)

我已根据here修改了您的代码。主要有两个不同之处。

  1. 我做到了所以文本框没有换行。如果您换行文本,则水平滚动条无法滚动到任何内容。

  2. 我在框架上使用网格几何管理器将滚动条和文本小部件保持在一起。使用.grid的好处是你实际上得到的滚动条是正确的宽度/高度(使用pack无法实现的)。

  3. ...

    from Tkinter import *
    import tkFont
    
    class DpWin(object):
        def run(self):
            root=Tk()
            root.geometry('768x612')
            title='dp'
            root.title(title)
    
            f = Frame(root)
            f.pack()
    
            xscrollbar = Scrollbar(f, orient=HORIZONTAL)
            xscrollbar.grid(row=1, column=0, sticky=N+S+E+W)
    
            yscrollbar = Scrollbar(f)
            yscrollbar.grid(row=0, column=1, sticky=N+S+E+W)
    
            text = Text(f, wrap=NONE,
                        xscrollcommand=xscrollbar.set,
                        yscrollcommand=yscrollbar.set)
            text.grid(row=0, column=0)
    
            xscrollbar.config(command=text.xview)
            yscrollbar.config(command=text.yview)
            text.insert(END, 'a'*999)
            mainloop()
    
        def start(self):
            self.b_start.config(state=DISABLED)
            self.b_stop.config(state=ACTIVE)
    
        def stop(self):
            self.b_stop.config(state=DISABLED)
            self.b_start.config(state=ACTIVE)
    
    if __name__=='__main__':
        win=DpWin()
        win.run()
    

答案 1 :(得分:0)

关于使x和y滚动条在pack框架内工作的说法有一条。这是一个最小的示例:

import tkinter as tk
from tkinter import X, Y, BOTTOM, RIGHT, LEFT, Y, HORIZONTAL
class TextExample(tk.Frame):
    def __init__(self, master=None):
        super().__init__()

        sy = tk.Scrollbar(self)
        sx = tk.Scrollbar(self,  orient=HORIZONTAL)
        editor = tk.Text(self, height=500, width=300, wrap='none')
        sx.pack(side=BOTTOM, fill=X)
        sy.pack(side=RIGHT, fill=Y)
        editor.pack(side=LEFT, fill=Y)
        sy.config(command=editor.yview)
        sx.config(command=editor.xview)
        self.pack()
def main():
    root = tk.Tk()
    root.geometry("800x500+0+0")
    app = TextExample(master=root)
    root.mainloop()  
if __name__ == '__main__':
    main()