(python)tkinter滚动条,带有用户生成的Entry字段

时间:2012-08-28 13:29:23

标签: python scroll tkinter

我正在编写一个tkinter GUI(我的第一个),它是用来输入用户输入的数据。

无论如何,我正在做的方式如下

from Tkinter import *
root = Tk()
textoutput = []
textbox = Entry(root, width = 5) 
textinput = []

x = 0 
offset = 0
yco = 40
press = 0 

textbox.pack()
textbox.place(x = 10, y = yco + offset) 

def addtextbox():
   global textinput, x, yco, offset, press, textbox

 offset = offset + 30
 txtinput = textbox.get()
 textinput.append(txtinput)

 textbox = Entry(root, width = 5)
 textbox.place(x = 10, y = yco + offset)



add = Button(root, text = "Add box", width = 10, command = addtextbox)    

add.pack()
add.place(x = 225, y = 5)

root.mainloop()

我遇到的问题是,当文本框太多而需要滚动条时,它会到达某一点。我尝试过使用effbot.org上的一些示例代码和其他一些我用Google搜索的地方,但他们似乎只是滚动背景而不是文本框本身。

有什么想法吗?

干杯

亚伦

1 个答案:

答案 0 :(得分:1)

这是一个(合理的)简单的基于类的解决方案。该类是一个tkinter画布(允许滚动很好)。我使用canvas作为几何管理器,这样我就可以在任何地方放置条目小部件(使用create_window方法)。

import Tkinter as tk    

class Manager(tk.Canvas):
    def __init__(self,master=None,**kwargs):
        tk.Canvas.__init__(self,master,**kwargs)
        self.widgets=[]

    def add_entry(self):
        entry = tk.Entry(self, width = 5)
        self.create_window(0,self._ypos(), anchor = tk.N+tk.W, window = entry)
        self.widgets.append(entry)

    def get_data(self):
        for w in self.widgets:
            print (w.get())

    def _ypos(self):
        return sum(x.winfo_reqheight() for x in self.widgets)

if __name__ == "__main__":
    root = tk.Tk()
    manager = Manager(root)
    manager.grid(row=0,column=0)
    scroll = tk.Scrollbar(root)
    scroll.grid(row=0,column=1,sticky=tk.N+tk.S)
    manager.config(yscrollcommand = scroll.set)
    scroll.config(command=manager.yview)
    b = tk.Button(root, text = "add entry", command = manager.add_entry)
    b.grid(row=1,column=0)
    b2 = tk.Button(root, text = "print stuff", command = manager.get_data)
    b2.grid(row=2,column=0)
    root.mainloop()

建议@BryanOakley(谢谢!)(未经测试

import Tkinter as tk    

class Manager(tk.Canvas):
    def __init__(self,master=None,**kwargs):
        tk.Canvas.__init__(self,master,**kwargs)
        self.frame = tk.Frame(self)
        self.create_window(0,0,anchor=tk.N+tk.W,window=self.frame)
        self.row = 0
        self.widgets = []

    def add_entry(self):
        entry = tk.Entry(self.frame)
        entry.grid(row = self.row,column = 0)
        self.row += 1
        self.widgets.append(entry)

现在像以前一样做其他事情来设置滚动条,你应该全部设置。