是否可以在tkinter&;中创建多个表单字段;python,然后以表列格式将其提交到输出文本框

是否可以在tkinter&;中创建多个表单字段;python,然后以表列格式将其提交到输出文本框,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,所以我的问题是,我想创建多个输入字段,比如超过30个,但每次我使用.pack或.grid重新格式化它时,它都会丢失格式。有没有一种方法可以在一个窗口中放置近30个输入框,而不使用类似SQLite的任何东西?正如我们从这段代码中看到的,我们有4个字段,你会如何继续缩小框以放入更多的输入字段,比如超过30个 其次,我想将所有类型化的数据输入字段输出到列表框。是否有方法向列表框添加一个表列,以显示每个输入字段的明细 第三种方法是,可以将列表框移动到同一窗口上的另一个选项卡,以显示键入的所有输入字段,如

所以我的问题是,我想创建多个输入字段,比如超过30个,但每次我使用.pack或.grid重新格式化它时,它都会丢失格式。有没有一种方法可以在一个窗口中放置近30个输入框,而不使用类似SQLite的任何东西?正如我们从这段代码中看到的,我们有4个字段,你会如何继续缩小框以放入更多的输入字段,比如超过30个

其次,我想将所有类型化的数据输入字段输出到列表框。是否有方法向列表框添加一个表列,以显示每个输入字段的明细

第三种方法是,可以将列表框移动到同一窗口上的另一个选项卡,以显示键入的所有输入字段,如果是,您将如何操作


这是我目前的代码


你的密码乱七八糟,布拉;我从你的问题中得出的结论是你需要一张桌子。我从您的代码中收集到的信息是,该表的单元格应由
标签
条目
组成。您还需要一个接口来创建条目。下面是所有这些的一个例子。我真的看不出有什么可以解释的。它只是一堆
框架
标签
条目
按钮
。唯一的实际操作是在
表中
。所有的动作都是,从数学上计算出下一个
项的位置。这些都是很基本的东西

import tkinter as tk
from tkinter import ttk


#the entire bottom row of the app.
#has a dependency on self.master.table ~ not good OOP
class EntryManager(tk.Frame):
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.grid_columnconfigure(5, weight=1)
        font='Helvetica 10 bold'

        tk.Label(self, text='Label', font=font, width=5).grid(row=0, column=0, padx=2)
        lbl = tk.Entry(self, width=10, font=font)
        lbl.grid(row=0, column=1, padx=2)

        tk.Label(self, text='Entry', font=font, width=5).grid(row=0, column=2, padx=2)
        ent = tk.Entry(self, width=25, font=font)
        ent.grid(row=0, column=3, padx=2)

        tk.Button(self, text='add', font=font, command=lambda: self.master.table.addItem(lbl.get(), ent.get())).grid(row=0, column=4, padx=2, sticky='w')

        tk.Label(self, text='rows', font=font, width=4).grid(row=0, column=5, padx=2, sticky='e')
        r = tk.Entry(self, width=4, font=font)
        r.insert('end', self.master.table.rows)
        r.grid(row=0, column=6, padx=2)

        tk.Label(self, text='cols', font=font, width=4).grid(row=0, column=7, padx=2)
        c = tk.Entry(self, width=4, font=font)
        c.insert('end', self.master.table.cols)
        c.grid(row=0, column=8, padx=2)

        tk.Button(self, text='set', font=font, command=lambda: self.master.table.setDims(r.get(), c.get())).grid(row=0, column=9, padx=2, sticky='e')


#generic scrollable frame
class ScrollFrame(tk.Frame):
    def __init__(self, master, row=0, column=0, scrollspeed=.02, **kwargs):        
        tk.Frame.__init__(self, master, **kwargs)
        self.grid(row=row, column=column, sticky='nswe')

        self.scrollspeed = scrollspeed

        self.canvas = tk.Canvas(self, highlightthickness=0)
        self.canvas.grid(column=0, row=0, sticky='nswe')

        self.v_scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
        self.v_scroll.grid(row=0, column=1, sticky='ns')

        self.canvas.configure(yscrollcommand=self.v_scroll.set)
        self.canvas.bind_all('<MouseWheel>', self.on_mousewheel)

        self.frame = tk.Frame(self.canvas, height=0)
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.bind('<Configure>', lambda e:self.canvas.configure(scrollregion=self.canvas.bbox("all")))
        self.canvas.create_window((0,0), window=self.frame, anchor="nw")

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def on_mousewheel(self, event):
        self.canvas.yview_moveto(self.v_scroll.get()[0]+((-event.delta/abs(event.delta))*self.scrollspeed))


#a table cell        
class Item(tk.Frame):
    @property
    def value(self):
        return self.__value.get()

    @value.setter
    def value(self, text):
        self.__value.set(text)

    def __init__(self, master, text, value, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        tk.Label(self, text=text, width=10, font='none 8 bold').grid(row=0, column=0, pady=5, padx=5)
        self.__value = tk.StringVar(value=value)
        tk.Entry(self, textvariable=self.__value, width=25).grid(row=0, column=1, pady=5, padx=5)


#the table
class Table(ScrollFrame):
    def __init__(self, master, rows=15, cols=3, **kwargs):
        ScrollFrame.__init__(self, master, **kwargs)
        self.entries = []
        self.rows = rows
        self.cols = cols

    def addItem(self, text, value):
        if len(self.entries) < self.rows*self.cols:
            self.entries.append(Item(self.frame, text, value))
            self.entries[-1].grid(row=(len(self.entries)-1)%self.rows, column=(len(self.entries)-1)//self.rows)

    def getItem(self, row, column):
        return self.entries[self.rows*column+row].value

    def setDims(self, rows, cols):
        if rows.isnumeric():
            self.rows = int(rows)
        if cols.isnumeric():
            self.cols = int(cols)

        for ent in self.entries:
            ent.grid_forget()

        for i, ent in enumerate(self.entries):
            if i < self.rows*self.cols:
                ent.grid(row=i%self.rows, column=i//self.rows)


class App(tk.Tk):
    WIDTH, HEIGHT, TITLE = 770, 465, 'Application'

    def __init__(self):
        tk.Tk.__init__(self)
        ttk.Style().theme_use("vista")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.table = Table(self, rows=20, cols=3)
        self.table.grid(row=0, column=0, sticky='nswe')

        EntryManager(self).grid(row=1, column=0, sticky='nswe', ipady=5)

        #junk for testing
        for i in range(12):
            self.table.addItem(f'entry_{i}', f'data {i}')


if __name__ == '__main__':
    app = App()
    app.config(background='black')
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}')
    #app.resizable(width=False, height=False)
    app.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
#应用程序的整个底部行。
#依赖于self.master.table~ OOP不好
类入口管理器(tk.Frame):
定义初始(自我、主控、**kwargs):
tk.Frame.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(自我,主控,**kwargs)
self.grid\u column配置(5,权重=1)
font='Helvetica 10 bold'
标签(self,text='Label',font=font,width=5).grid(行=0,列=0,padx=2)
lbl=tk.Entry(self,width=10,font=font)
lbl.grid(行=0,列=1,padx=2)
标签(self,text='Entry',font=font,width=5).grid(行=0,列=2,padx=2)
ent=tk.Entry(self,width=25,font=font)
ent.grid(行=0,列=3,padx=2)
tk.Button(self,text='add',font=font,command=lambda:self.master.table.addItem(lbl.get(),ent.get())).grid(行=0,列=4,padx=2,粘滞=w')
标签(self,text='rows',font=font,width=4).网格(row=0,column=5,padx=2,sticky='e')
r=tk.Entry(self,width=4,font=font)
r、 插入('end',self.master.table.rows)
r、 网格(行=0,列=6,padx=2)
标签(self,text='cols',font=font,width=4).grid(行=0,列=7,padx=2)
c=tk.Entry(self,width=4,font=font)
c、 插入('end',self.master.table.cols)
c、 网格(行=0,列=8,padx=2)
tk.Button(self,text='set',font=font,command=lambda:self.master.table.setDims(r.get(),c.get()).grid(行=0,列=9,padx=2,粘滞=e')
#通用可滚动框架
类ScrollFrame(tk.Frame):
定义初始化(self,master,行=0,列=0,滚动速度=0.02,**kwargs):
tk.Frame.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(自我,主控,**kwargs)
self.grid(行=行,列=列,sticky='nswe')
self.scrollspeed=滚动速度
self.canvas=tk.canvas(self,highlightthickness=0)
self.canvas.grid(列=0,行=0,sticky='nswe')
self.v_scroll=tk.Scrollbar(self,orient='vertical',command=self.canvas.yview)
self.v_scroll.grid(行=0,列=1,sticky='ns')
self.canvas.configure(yscrollcommand=self.v_scroll.set)
self.canvas.bind_all(“”,self.on_鼠标滚轮)
self.frame=tk.frame(self.canvas,高度=0)
self.frame.grid\u columnconfigure(0,权重=1)
self.frame.bind(“”,lambda e:self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
self.canvas.create_window((0,0),window=self.frame,anchor=“nw”)
self.grid_rowconfigure(0,权重=1)
self.grid\u column配置(0,权重=1)
鼠标滚轮上的def(自身,事件):
self.canvas.yview_moveto(self.v_scroll.get()[0]+(-event.delta/abs(event.delta))*self.scrollspeed))
#桌上的小房间
类项目(tk.Frame):
@财产
def值(自身):
返回self.\u value.get()
@价值设定者
def值(自身,文本):
self.\u value.set(文本)
定义初始化(自身、主控、文本、值,**kwargs):
tk.Frame.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(自我,主控,**kwargs)
tk.Label(self,text=text,width=10,font='none 8 bold').grid(行=0,列=0,pady=5,padx=5)
self.\uu value=tk.StringVar(value=value)
tk.Entry(self,textvariable=self.\uu值,宽度=25).grid(行=0,列=1,pady=5,padx=5)
#桌子
类表(滚动框):
定义初始值(self、master、rows=15、cols=3、**kwargs):
ScrollFrame.\uuuuuu init\uuuuuuuuuuuuuuuuuu(自我、主控、**kwargs)
self.entries=[]
self.rows=行
self.cols=cols
def附加项(自身、文本、值):
如果len(self.entries)import tkinter as tk
from tkinter import ttk


#the entire bottom row of the app.
#has a dependency on self.master.table ~ not good OOP
class EntryManager(tk.Frame):
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.grid_columnconfigure(5, weight=1)
        font='Helvetica 10 bold'

        tk.Label(self, text='Label', font=font, width=5).grid(row=0, column=0, padx=2)
        lbl = tk.Entry(self, width=10, font=font)
        lbl.grid(row=0, column=1, padx=2)

        tk.Label(self, text='Entry', font=font, width=5).grid(row=0, column=2, padx=2)
        ent = tk.Entry(self, width=25, font=font)
        ent.grid(row=0, column=3, padx=2)

        tk.Button(self, text='add', font=font, command=lambda: self.master.table.addItem(lbl.get(), ent.get())).grid(row=0, column=4, padx=2, sticky='w')

        tk.Label(self, text='rows', font=font, width=4).grid(row=0, column=5, padx=2, sticky='e')
        r = tk.Entry(self, width=4, font=font)
        r.insert('end', self.master.table.rows)
        r.grid(row=0, column=6, padx=2)

        tk.Label(self, text='cols', font=font, width=4).grid(row=0, column=7, padx=2)
        c = tk.Entry(self, width=4, font=font)
        c.insert('end', self.master.table.cols)
        c.grid(row=0, column=8, padx=2)

        tk.Button(self, text='set', font=font, command=lambda: self.master.table.setDims(r.get(), c.get())).grid(row=0, column=9, padx=2, sticky='e')


#generic scrollable frame
class ScrollFrame(tk.Frame):
    def __init__(self, master, row=0, column=0, scrollspeed=.02, **kwargs):        
        tk.Frame.__init__(self, master, **kwargs)
        self.grid(row=row, column=column, sticky='nswe')

        self.scrollspeed = scrollspeed

        self.canvas = tk.Canvas(self, highlightthickness=0)
        self.canvas.grid(column=0, row=0, sticky='nswe')

        self.v_scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
        self.v_scroll.grid(row=0, column=1, sticky='ns')

        self.canvas.configure(yscrollcommand=self.v_scroll.set)
        self.canvas.bind_all('<MouseWheel>', self.on_mousewheel)

        self.frame = tk.Frame(self.canvas, height=0)
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.bind('<Configure>', lambda e:self.canvas.configure(scrollregion=self.canvas.bbox("all")))
        self.canvas.create_window((0,0), window=self.frame, anchor="nw")

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def on_mousewheel(self, event):
        self.canvas.yview_moveto(self.v_scroll.get()[0]+((-event.delta/abs(event.delta))*self.scrollspeed))


#a table cell        
class Item(tk.Frame):
    @property
    def value(self):
        return self.__value.get()

    @value.setter
    def value(self, text):
        self.__value.set(text)

    def __init__(self, master, text, value, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        tk.Label(self, text=text, width=10, font='none 8 bold').grid(row=0, column=0, pady=5, padx=5)
        self.__value = tk.StringVar(value=value)
        tk.Entry(self, textvariable=self.__value, width=25).grid(row=0, column=1, pady=5, padx=5)


#the table
class Table(ScrollFrame):
    def __init__(self, master, rows=15, cols=3, **kwargs):
        ScrollFrame.__init__(self, master, **kwargs)
        self.entries = []
        self.rows = rows
        self.cols = cols

    def addItem(self, text, value):
        if len(self.entries) < self.rows*self.cols:
            self.entries.append(Item(self.frame, text, value))
            self.entries[-1].grid(row=(len(self.entries)-1)%self.rows, column=(len(self.entries)-1)//self.rows)

    def getItem(self, row, column):
        return self.entries[self.rows*column+row].value

    def setDims(self, rows, cols):
        if rows.isnumeric():
            self.rows = int(rows)
        if cols.isnumeric():
            self.cols = int(cols)

        for ent in self.entries:
            ent.grid_forget()

        for i, ent in enumerate(self.entries):
            if i < self.rows*self.cols:
                ent.grid(row=i%self.rows, column=i//self.rows)


class App(tk.Tk):
    WIDTH, HEIGHT, TITLE = 770, 465, 'Application'

    def __init__(self):
        tk.Tk.__init__(self)
        ttk.Style().theme_use("vista")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.table = Table(self, rows=20, cols=3)
        self.table.grid(row=0, column=0, sticky='nswe')

        EntryManager(self).grid(row=1, column=0, sticky='nswe', ipady=5)

        #junk for testing
        for i in range(12):
            self.table.addItem(f'entry_{i}', f'data {i}')


if __name__ == '__main__':
    app = App()
    app.config(background='black')
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}')
    #app.resizable(width=False, height=False)
    app.mainloop()