基本Tkinter/GUI问题

2024-04-18 03:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python的Tkinter弄脏我的手,特别是学习GUIs的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对象,不管它是否有主对象。我甚至没有打包我的框架对象。为什么?

  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__()时发生了什么变化?你知道吗
    • 我应该在__init__()内还是在类外调用pack()方法?它是双向的,但我猜有一些优点/缺点。你知道吗

谢谢!


Tags: 对象texttestselfmasternoneinit部件
2条回答

1。 在这段代码中,由于init不返回任何内容,所以只需初始化一个带有None的文本,如

 text = Text(None, width=20, height=5)

您需要在__init__()内使用text.pack()使其生效。你知道吗

主控件用作主控件。没有它的小部件是它自己的主小部件。这就是为什么有时我们不给它一个主人。你知道吗

2。你知道吗

在这段代码中,通过给文本一个self参数,可以用一个Frame实例初始化文本。您需要在__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()

如果这有帮助,请确认它作为一个答案,以便其他人可以很快找到它。谢谢!你知道吗

What's the purpose of the default master argument being None?

没有目的。除了Tk的初始实例之外,每个小部件都需要一个父小部件。如果主窗口是None,它将使用根窗口作为默认窗口,但是显式窗口总是优于隐式窗口,因此您应该始终显式设置主窗口。你知道吗

I also noticed that I did not need to pack() my KeyLogger object, regardless if it had a master or not. I did not even pack the my Frame object. Why is that?

不可能回答这个问题。要显示小部件,必须调用packgridplace(或者,小部件需要插入画布或文本小部件)。你一定是在代码中某个地方做了你没有给我们看的事情。你知道吗

I now have to pack() my KeyLogger object, regardless if a master widget was present. What changed when I removed the assignment statement and just called Frame.init()?

当您将__init__的值赋给frame时,frame被设置为None,这意味着文本小部件进入根窗口而不是您正在创建的框架。在某个地方一定有代码导致小部件被打包、放置或网格化。你知道吗

Should I call the pack() method inside init() or outside the class? It works both ways but I'm guessing there are some pros/cons.

小部件(或复合小部件,如此)不应在其父部件中自身pack(或gridplace)。这就产生了一种紧密耦合,新类需要知道有关其父类的一些信息(特别是,父类中的其他小部件是否也使用packplacegrid)。你知道吗

相关问题 更多 >