我用Python的Tkinter弄脏了我的手,专门为GUI学习OOP并且有一些问题。
构建类似的类时:
class Keylogger(Frame):
def __init__(self, master=None):
frame = Frame.__init__(self, master)
text = Text(frame, width=20, height=5)
...
test = KeyLogger()
test.mainloop()
默认主参数为None
的目的是什么?通常我一直在学习指定像root = Tk()
这样的主要小部件。是否有时候不需要/想要主窗口小部件?
我还注意到我不需要pack()
我的KeyLogger对象,无论它是否有主人。我甚至没有打包我的Frame对象。那是为什么?
然后我注意到,如果我更改了__init__
方法中的代码,那么:
def __init__(self, master=None):
Frame.__init__(self, master) # no more assignment statement
text = Text(self, width=20, height=5) # first constructor arg. changed
...
test = KeyLogger()
test.mainloop()
pack()
我的KeyLogger对象,无论是否存在主窗口小部件。当我删除赋值语句并刚刚调用Frame.__init__()
时发生了什么变化?pack()
内或课外调用__init__()
方法吗?它有两种方式,但我猜有一些优点/缺点。谢谢!
答案 0 :(得分:0)
1。 在此代码中,由于 init 不返回任何内容,因此您只需使用None初始化Text,例如
text = Text(None, width=20, height=5)
您需要在text.pack()
内使用__init__()
才能使其生效。
master用作主窗口小部件。没有它的小部件是它自己的主小部件。这就是为什么我们有时候不给它一个主人。
2
在此代码中,通过为其提供一个self参数来初始化带有Frame实例的Text。您需要在__init__()
内和主进程中打包以使它们都生效。像
from Tkinter import *
class KeyLogger(Frame):
def __init__(self, master=None):
# frame = Frame.__init__(self, master)
Frame.__init__(self, master)
# text = Text(frame, width=20, height=5)
text = Text(self, width=20, height=5)
text.pack()
test = KeyLogger()
test.pack()
test.mainloop()
如果这有帮助,请将其确认为答案,以便其他人可以快速找到答案。谢谢!
答案 1 :(得分:0)
默认主参数的目的是什么?
没有目的。除Tk
的初始实例之外的每个小部件都需要父小部件。如果主服务器是None
,它将使用根窗口作为默认值,但显式总是优于隐式,因此您应始终显式设置主服务器。
我还注意到我不需要打包()我的KeyLogger对象,无论它是否有主人。我甚至没有打包我的Frame对象。那是为什么?
不可能回答这个问题。要显示小部件,必须调用pack
,grid
或place
(或者,小部件需要插入到画布或文本小部件中)。您必须使用您未向我们展示的代码中的其中一个。
我现在必须打包()我的KeyLogger对象,无论是否存在主窗口小部件。当我删除赋值语句并刚刚调用Frame时发生了什么变化。 init ()?
当您将__init__
的值分配给frame
时,框架设置为None
,这意味着文本小部件会进入根窗口而不是您正在创建的框架中。必须有某个地方的代码导致该小部件被打包,放置或网格化。
我应该在 init ()内部还是在课外调用pack()方法?它有两种方式,但我猜有一些优点/缺点。
小部件(或复合小部件,例如此小部件)在其父级中永远不应pack
(或grid
或place
)。这会产生紧密耦合 - 新类需要了解其父级(具体而言,父级中的其他小部件是否也使用pack
,place
或grid
。