使用Python和tkinter,在类中创建框架时使用_uinit_uuu有什么好处?
我正在通过几个教程(Python-course.eu&effbot.org)学习Python和tkinter。我遇到了两种情况,我正在努力了解差异背后的原因 注意:我在课堂上发现了许多关于使用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
\uuuuuu init\uuuuu
的问题,但在框架中没有发现\uuuuuuuu init\uuuuu
的问题
两者都从main调用一个类,并使用构造函数(def\uuu init\uuu
)创建该类的实例。我使用的术语正确吗
它们都创建了一个框架;但是,一个使用Frame.\uuuu init\uuuu(self,parent):
,另一个使用Frame(master):
- 为什么第一个在框架的构造中包含
\uuuuu init\uuuu
- 为什么第二个在创建框架时在参数中省略“self”
- 为什么第一个不使用“pack”来放置,而第二个使用
- 还有哪些差异值得注意
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()