tkinter、小部件和 OOP 放置在窗口中

问题描述 投票:0回答:1

尝试了解如何指定哪个窗口将容纳哪个小部件。 我在一些看似非常基本的事情上遇到了困难,但我看不到它。 以下内容来自维基百科(https://en.wikipedia.org/wiki/Tkinter):

import tkinter as tk

class Application(tk.Frame):

    def __init__(self, root=None):
        tk.Frame.__init__(self, root)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.medialLabel = tk.Label(self, text='Hello World')
        self.medialLabel.config(bg="#00ffff")
        self.medialLabel.grid()
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

app = Application()
app.root = tk.Tk()
app.root.title('Sample application')
app.mainloop()

我的问题: 为什么会弹出2个窗口?如何重写它以使小部件显示在“示例应用程序”窗口中?我如何使用 OOP 更改此设置以在一个窗口中显示标签并在另一个窗口中显示按钮?

我已经从代码中删除了“root”:输出没有变化。消除 self.grid() 会显示 2 个空窗口,消除该函数并将标签和按钮移至主代码也是如此。 tk.Frame 似乎什么也没做

python oop tkinter widget
1个回答
0
投票

当创建

app
(a
tk.Frame
)时,将隐式创建一个root窗口。 所以
app.root
是第二个根窗口。

您可以先显式创建根窗口,然后创建

Application
的实例:

import tkinter as tk

class Application(tk.Frame):

    def __init__(self, root=None):
        tk.Frame.__init__(self, root)
        #self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.medialLabel = tk.Label(self, text='Hello World')
        self.medialLabel.config(bg="#00ffff")
        self.medialLabel.grid()
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

root = tk.Tk()
root.title('Sample application')
app = Application(root)
app.grid()
root.mainloop()

或者你可以简单地让

Application
继承自
tk.Tk

class Application(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Sample application')
        self.createWidgets()

    def createWidgets(self):
        self.medialLabel = tk.Label(self, text='Hello World')
        self.medialLabel.config(bg="#00ffff")
        self.medialLabel.grid()
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

Application().mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.