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

(python)带有用户生成的输入字段的tkinter滚动条,python,scroll,tkinter,Python,Scroll,Tkinter,我正在编写一个TkinterGUI(我的第一个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)

我正在编写一个TkinterGUI(我的第一个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和我在谷歌搜索过的其他地方的一些示例代码,但它们似乎只是滚动背景,而不是文本框本身

有什么想法吗

干杯

Aaron

这里有一个(相当)简单的基于类的解决方案。该类是一个tkinter画布(它允许很好地滚动)。我将画布用作几何体管理器,以便可以将条目小部件放置在我选择的任何位置(使用
create\u window
方法)


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


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

我认为您的缩进使用addtextbox函数有点奇怪。您可以修复它吗?您也可以在画布中使用框架,然后在框架中打包或网格化条目小部件。@BryanOakley--谢谢。通过
tk.N+tk.W
锚定小部件可能比
tk.N
然后调整位置要好。我已经更新了这两个帐户。感谢您的回复\,我似乎无法让它工作,它似乎显示了滚动条区域,但不允许您滚动区域。您需要配置画布的
滚动区域
属性。它定义了应该由滚动条管理的虚拟画布区域@BryanOakley的更新似乎打破了滚动条。它的状态似乎没有得到更新。无论添加多少条目,它都将保持禁用状态。
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()
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)