Python 3.x 制作a类小部件-Tkinter
我现在有一个小问题——我有一个名为tableView的类,我真正希望它能像TK()框架中的普通widgit一样使用。我想通过做这样的事情来称呼它-Python 3.x 制作a类小部件-Tkinter,python-3.x,tkinter,widget,Python 3.x,Tkinter,Widget,我现在有一个小问题——我有一个名为tableView的类,我真正希望它能像TK()框架中的普通widgit一样使用。我想通过做这样的事情来称呼它- root = Tk() root.wm_title("Main") ttk.Button(root, text="Add new student").grid(row = 0, column = 0) ttk.Button(root, text="Edit Student").grid(row = 0, column = 1) ttk.Button(
root = Tk()
root.wm_title("Main")
ttk.Button(root, text="Add new student").grid(row = 0, column = 0)
ttk.Button(root, text="Edit Student").grid(row = 0, column = 1)
ttk.Button(root, text="Edit Student").grid(row = 0, column = 2)
columns = ['ID', 'First Name', 'Last Name', 'Registration No']
rows = server.select("Student")
TableView(root, columns, rows)
root.mainloop()
让它在我当前的tk()帧中播放。目前,它会在自己的窗口中弹出,我很想知道如何将它添加到当前帧中。我假设它必须从一个小部件继承,并以某种方式使用父值?要做到这一点有多棘手?是否有易于扩展的类
class TableView(object):
"""use a ttk.TreeView as a multicolumn ListBox"""
def __init__(self, columns, rows):
self.rows = rows
self.columns = columns
self.tree = None
self._setup_widgets()
self._build_tree()
def _setup_widgets(self):
container = ttk.Frame()
container.pack(fill='both', expand=True)
self.tree = ttk.Treeview(columns=self.columns, show="headings")
self.tree.grid(column=0, row=0, sticky='nsew', in_=container)
container.grid_columnconfigure(0, weight=1)
container.grid_rowconfigure(0, weight=1)
def _build_tree(self):
for col in self.columns:
self.tree.heading(col, text=col.title(),
command=lambda c=col: sortby(self.tree, c, 0))
self.tree.column(col,
width=tkFont.Font().measure(col.title()))
for item in self.rows:
self.tree.insert('', 'end', values=item)
def sortby(tree, col, descending):
"""sort tree contents when a column header is clicked on"""
data = [(tree.set(child, col), child)
for child in tree.get_children('')]
data.sort(reverse=descending)
for ix, item in enumerate(data):
tree.move(item[1], '', ix)
tree.heading(col, command=lambda col=col: sortby(tree, col, int(not descending)))
root = tk.Tk()
root.wm_title("Journeys")
c = tk.Canvas(root, height=-8, width=800)
c.pack()
我对python比较陌生,因此非常感谢您的帮助——还有,这是制作表格的合理方法吗——有没有更好的方法/库
谢谢你的帮助
Ollie您的
TableView
类需要从Frame
继承。当您这样做时,您可以像对待任何其他小部件一样对待它
例如:
class TableView(Frame):
def __init__(self, parent, columns, rows):
Frame.__init__(self, parent)
self.columns = columns
self.rows = rows
...
self._setup_widgets()
...
def setup_widgets(self):
self.tree = ttk.Treeview(self, columns=self.columns, show="heading")
self.tree.grid(column=0, row=0, sticky="nsew")
...
您不需要创建容器,因为对象是它自己的容器。类中的任何子窗口小部件都应该打包/网格化到self
,以便它们位于容器中
此外,除了在主程序中之外,不应该在任何地方调用tk.tk()——这就是为什么会有一个单独的窗口
除了需要添加一行代码以将小部件放置在网格中之外,您的主程序几乎没有变化:
root = Tk()
root.wm_title("Main")
ttk.Button(root, text="Add new student").grid(row = 0, column = 0)
ttk.Button(root, text="Edit Student").grid(row = 0, column = 1)
ttk.Button(root, text="Edit Student").grid(row = 0, column = 2)
columns = ['ID', 'First Name', 'Last Name', 'Registration No']
rows = server.select("Student")
# create an instance of the TableView widget
tableview = TableView(root, columns, rows)
# ... and add it to the root window
tableview.grid(row=1, column=0, columnspan=3)
root.mainloop()
谢谢,谢谢,谢谢。在做了一点手脚之后,我把它记下来了。无论你身在何处,祝你有一个美好的白天/夜晚!