基本的Tkinter / GUI问题

时间:2014-08-24 03:45:54

标签: python python-3.x tkinter

我用Python的Tkinter弄脏了我的手,专门为GUI学习OOP并且有一些问题。

  1. 构建类似的类时:

    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对象。那是为什么?

  2. 然后我注意到,如果我更改了__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__()方法吗?它有两种方式,但我猜有一些优点/缺点。
  3. 谢谢!

2 个答案:

答案 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对象。那是为什么?

不可能回答这个问题。要显示小部件,必须调用packgridplace(或者,小部件需要插入到画布或文本小部件中)。您必须使用您未向我们展示的代码中的其中一个。

  

我现在必须打包()我的KeyLogger对象,无论是否存在主窗口小部件。当我删除赋值语句并刚刚调用Frame时发生了什么变化。 init ()?

当您将__init__的值分配给frame时,框架设置为None,这意味着文本小部件会进入根窗口而不是您正在创建的框架中。必须有某个地方的代码导致该小部件被打包,放置或网格化。

  

我应该在 init ()内部还是在课外调用pack()方法?它有两种方式,但我猜有一些优点/缺点。

小部件(或复合小部件,例如此小部件)在其父级中永远不应pack(或gridplace)。这会产生紧密耦合 - 新类需要了解其父级(具体而言,父级中的其他小部件是否也使用packplacegrid