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