Python 3.x 制作a类小部件-Tkinter

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(

我现在有一个小问题——我有一个名为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, 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()

谢谢,谢谢,谢谢。在做了一点手脚之后,我把它记下来了。无论你身在何处,祝你有一个美好的白天/夜晚!