使用Python和tkinter,在类中创建框架时使用_uinit_uuu有什么好处?

使用Python和tkinter,在类中创建框架时使用_uinit_uuu有什么好处?,python,tkinter,frame,init,Python,Tkinter,Frame,Init,我正在通过几个教程(Python-course.eu&effbot.org)学习Python和tkinter。我遇到了两种情况,我正在努力了解差异背后的原因 注意:我在课堂上发现了许多关于\uuuuuu init\uuuuu的问题,但在框架中没有发现\uuuuuuuu init\uuuuu的问题 两者都从main调用一个类,并使用构造函数(def\uuu init\uuu)创建该类的实例。我使用的术语正确吗 它们都创建了一个框架;但是,一个使用Frame.\uuuu init\uuuu(self

我正在通过几个教程(Python-course.eu&effbot.org)学习Python和tkinter。我遇到了两种情况,我正在努力了解差异背后的原因

注意:我在课堂上发现了许多关于
\uuuuuu init\uuuuu
的问题,但在框架中没有发现
\uuuuuuuu init\uuuuu
的问题

两者都从main调用一个类,并使用构造函数(
def\uuu init\uuu
)创建该类的实例。我使用的术语正确吗

它们都创建了一个框架;但是,一个使用
Frame.\uuuu init\uuuu(self,parent):
,另一个使用
Frame(master):

  • 为什么第一个在框架的构造中包含
    \uuuuu init\uuuu
  • 为什么第二个在创建框架时在参数中省略“self”
  • 为什么第一个不使用“pack”来放置,而第二个使用
  • 还有哪些差异值得注意
以下是MWE产生相应输出的步骤

import tkinter as tk

class Checkbar(tk.Frame):
   def __init__(self, parent=None, picks=[], side=tk.LEFT, anchor=tk.W):
      tk.Frame.__init__(self, parent)
      self.vars = []
      for pick in picks:
         var = tk.IntVar()
         chk = tk.Checkbutton(self, text=pick, variable=var)
         chk.pack(side=side, anchor=anchor, expand=tk.YES)
         self.vars.append(var)
   def state(self):
      return map((lambda var: var.get()), self.vars)

if __name__ == '__main__':
   root = tk.Tk()

   lng = Checkbar(root, ['Python', 'Ruby', 'Perl', 'C++'])
   tgl = Checkbar(root, ['English','German'])
   lng.pack(side=tk.TOP,  fill=tk.X)
   tgl.pack(side=tk.LEFT)
   lng.config(relief=tk.GROOVE, bd=2)

   def allstates(): 
      print(list(lng.state()), list(tgl.state()))
   tk.Button(root, text='Quit', command=root.destroy).pack(side=tk.RIGHT)
   tk.Button(root, text='Peek', command=allstates).pack(side=tk.RIGHT)

   root.mainloop()
   print("You've selected ", list(lng.state()))


非常感谢。

前者是
tk.Frame
的子类,后者不是。因此,
Checkbar
是并且可以用作tk.frame,而后者,
App
不是也不能用作tk.frame。您看到的是面向对象编程的两种方法之间的区别:继承(Checkbar是一个frame)与组合(App包含一个frame)。复选框不会自行打包,就像普通框架不会自行打包一样:这是用户的责任。事实上,在您给出的示例中,它无法自行打包:这个类有两个实例,它们的打包方式不同,它怎么知道要使用哪一组参数?@jasonharper:你应该把你的评论移到答案部分。你要问的所有问题都可以通过阅读一些文档或学习基本的python教程来回答。几乎所有这些都与tkinter无关。前者是
tk.Frame
的子类,而后者则不是。因此,
Checkbar
是并且可以用作tk.frame,而后者,
App
不是也不能用作tk.frame。您看到的是面向对象编程的两种方法之间的区别:继承(Checkbar是一个frame)与组合(App包含一个frame)。复选框不会自行打包,就像普通框架不会自行打包一样:这是用户的责任。事实上,在您给出的示例中,它无法自行打包:这个类有两个实例,它们的打包方式不同,它怎么知道要使用哪一组参数?@jasonharper:你应该把你的评论移到答案部分。你要问的所有问题都可以通过阅读一些文档或学习基本的python教程来回答。几乎所有这些都与特金特无关。
import tkinter as tk

class App:
    def __init__(self, master):  

        frame = tk.Frame(master)
        frame.pack()

        self.button = tk.Button(frame, text="Quit", fg="red", command=master.destroy, padx=20)
        self.button.pack(side='left', expand=10)

        self.hi_there = tk.Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side='left')

    def say_hi(self):
        print("Hi there, everyone!")

if __name__ == '__main__':
    root = tk.Tk()
    app = App(root)
    root.mainloop()