2012-09-12 38 views
3

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

我在哪里犯了一个错误?

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() 
+0

以何种方式它不工作? (这个答案应该有所帮助:http://stackoverflow.com/a/6964782/404469) – gary

回答

7

我已根据here修改了您的代码。有两个主要的区别。

  1. 我做到了,所以文本框没有换行。如果换行文字,水平滚动条不能滚动到任何地方。

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

...

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() 
+0

感谢您的帮助和advice.It帮助我!我在创建Text时丢失了“wrap = NONE”。我将学习如何使用网格几何管理器。谢谢! – lvshuchengyin

+1

当然。总是乐于提供帮助。祝你好运。 (我更喜欢'网格'来包装')。有人认为包更容易,但我一直认为'网格'更直观... – mgilson

+0

@mgilson我面临同样的问题。使用包管理器时,xscrollbar将无法工作。即使我评论了Yscrollbar代码。您上面提供的解决方案适用于网格管理器。但是,如果代码很长并且包管理器已经在使用中,那么网格管理器没有任何帮助。使用网格管理器和包装漫画器导致代码进入无限的谈判。我希望你使用包管理器发布解决方案。我仍然陷入这个问题。提前致谢! – Mohammed