使用 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'
请注意,
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()