代码之家  ›  专栏  ›  技术社区  ›  Colonel Beauvel

Tkinter-包含按钮的类

  •  2
  • Colonel Beauvel  · 技术社区  · 9 年前

    我有一个 Tkinter

    编程 具有模块化类的应用程序。。原子代码是:

    import Tkinter as tk
    
    class MainApplication(tk.Frame):
        def __init__(self, parent, *args, **kwargs):
            tk.Frame.__init__(self, parent, *args, **kwargs)
            self.parent = parent
            self.navbar = NavBar(self)
            self.navbar.grid(row=0, column=0)
    
    class NavBar(tk.Frame):
        def __init__(self, parent):
            tk.Frame.__init__(self, parent)
            self.parent = parent
            self.fetchDataBtn = tk.Button(self, text='Fetch data')
            self.filterDataBtn = tk.Button(self, text='Filter data')
    
            self.fetchDataBtn.pack(padx=5, pady=10, side=tk.LEFT)
            self.filterDataBtn.pack(padx=5, pady=20, side=tk.LEFT)
    
    def main():
        root = tk.Tk()
        app = MainApplication(root)
        root.mainloop()
    
    if __name__ == '__main__':
        main()
    

    注意:我正在使用Python 2.7.10

    2 回复  |  直到 9 年前
        1
  •  5
  •   Right leg A.s. Bhullar    9 年前

    问题是你没有打包(或网格或放置)你的 MainApplication 自从你 主要应用程序 tk.Frame 类,其实例是小部件,因此需要打包到其主程序中。

    def main():
        root = tk.Tk()
        app = MainApplication(root)     <--- here: where does it go in the root?
        root.mainloop()
    

    app.pack()
    
        2
  •  1
  •   Reblochon Masque    9 年前

    您必须将导航栏放置在父帧中,使用 pack 或 grid

    import Tkinter as tk
    
    class MainApplication(tk.Frame):
        def __init__(self, parent, *args, **kwargs):
            tk.Frame.__init__(self, parent, *args, **kwargs)
            self.parent = parent
            self.navbar = NavBar(self)   
            self.navbar.grid(row=0, column=0)
            self.pack()             # <-- here ---------
    
    class NavBar(tk.Frame):
        def __init__(self, parent):
            tk.Frame.__init__(self, parent)
            self.parent = parent
            self.fetchDataBtn = tk.Button(self, text='Fetch data')
            self.filterDataBtn = tk.Button(self, text='Filter data')
    
            self.fetchDataBtn.pack(padx=5, pady=10, side=tk.LEFT)
            self.filterDataBtn.pack(padx=5, pady=20, side=tk.LEFT)
    
    def main():
        root = tk.Tk()
        app = MainApplication(root)
        # app.pack()   # <-- or here for a better control of the placement of several instances
        root.mainloop()
    
    if __name__ == '__main__':
        main()
    

    感谢@RightLeg指出了最初的错误。