0

I'm writing a tkinter GUI (my first one) and it is to colate data from user inputs.

anyway the way I'm doing that is as follows

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

The problem I'm having is that it gets to a certain point when there are too many text boxes to see and I need a scroll bar. I've tried using some sample code from effbot.org and some other places that I've googled but all they seem to do is scroll the background and not the text boxes themselves.

Any ideas ?

Cheers

Aaron

4

1 回答 1

1

这是一个(合理的)简单的基于类的解决方案。该类是一个 tkinter 画布(它允许很好地滚动)。我将画布用作几何管理器,以便可以将条目小部件放置在我选择的任何位置(使用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)

现在像以前一样做其他的事情来设置滚动条,你应该已经准备好了。

于 2012-08-28T13:56:13.880 回答