Python tkinter 类多个窗口

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

使用 tkinter,我尝试从另一个窗口打开一个窗口,并通过在类中创建窗口来实现此目的。

这个问题讨论了 tkinter 和类,但不是多个窗口:Python Tkinter 与类

这个问题解决了多个窗口,但它创建了该类的实例:Python tkinter multiple windows。我不想创建该类的实例,因为 tkdoc.com 将

root = Tk()
传递到该类中,而不是创建实例。

所以,我有来自 https://www.pythontutorial.net/tkinter/tkinter-toplevel/ 的示例,它可以实现我想要的功能,但它创建了

tk.TK
的子类,而不是传入
root
。我正在尝试修改此示例以传入
root
,因为这就是官方文档所做的。

这是一个窗口打开另一个有效窗口的示例,但它创建了

tk.Tk
的子类:

import tkinter as tk
from tkinter import ttk


class Window(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)

        self.geometry('300x100')
        self.title('Toplevel Window')

        ttk.Button(self,
                text='Close',
                command=self.destroy).pack(expand=True)


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry('300x200')
        self.title('Main Window')

        # place a button on the root window
        ttk.Button(self,
                text='Open a window',
                command=self.open_window).pack(expand=True)

    def open_window(self):
        window = Window(self)
        window.grab_set()


if __name__ == "__main__":
    app = App()
    app.mainloop()

这是我的改编:

from tkinter import *
from tkinter import ttk


class Window(Toplevel):
    def __init__(self, parent):
        super().__init__(parent)

        self.geometry('300x100')
        self.title('Toplevel Window')

        ttk.Button(self,
                text='Close',
                command=self.destroy).pack(expand=True)


class App():
    def __init__(self, root):
        super().__init__()

        root.geometry('300x200')
        root.title('Main Window')

        # place a button on the root window
        ttk.Button(root,
                text='Open a window',
                command=self.open_window).pack(expand=True)

    def open_window(self):
        window = Window(self)
        window.grab_set()


if __name__ == "__main__":
    root = Tk()
    App(root)
    root.mainloop()

第一个窗口打开得很好(

class App()
)。我在尝试打开第二个窗口 (
AttributeError
) 时出现了
class Window(Toplevel)
。然而,
AttributeError
位于第一个窗口上。

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1948, in __call__        
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Users\User\Documents\Python\Python_Tutorial_net\Multiple_Windows_pass-in-Class.py", line 30, in open_window
    window = Window(self)
             ^^^^^^^^^^^^
  File "c:\Users\User\Documents\Python\Python_Tutorial_net\Multiple_Windows_pass-in-Class.py", line 7, in __init__
    super().__init__(parent)
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2678, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2623, in __init__
    self._setup(master, cnf)
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2592, in _setup
    self.tk = master.tk
              ^^^^^^^^^
AttributeError: 'App' object has no attribute 'tk'
python class tkinter
1个回答
0
投票

请注意,

App()
的实例不是 tkinter 小部件,因此它不能用作第二个窗口的父窗口。

使用根窗口作为 seocnd 窗口的父窗口:

class App():
    def __init__(self, root):
        super().__init__()
        self.root = root   # save root to an instance variable
        ...

    def open_window(self):
        window = Window(self.root)  # used self.root instead of self
        window.grab_set()
© www.soinside.com 2019 - 2024. All rights reserved.