我在为继承自 tkinter 的 Toplevel 对话框的类编写构造函数时遇到问题。我从另一个本身继承自 Frame 的类调用它。我遇到的问题是我提出的代码的一个有趣的副作用。当 Toplevel 对话框被实例化时,我得到调用框架的一个额外实例。我只是想问问是否有人可以指出正确的方向,说明如何在自定义 Toplevel 类的构造函数中调用 super。这在 Python 框架内。我目前拥有的全部代码如下:
from tkinter import *
from tkinter import ttk
class App(Frame):
dialog = None
def __init__(self, root):
super(App, self).__init__(root)
self.root = root
self.create_widgets()
def create_widgets(self):
self.grid(row=3, column=1)
self.t1 = Text(root, wrap="word")
self.t1.grid(row=0, column=0, rowspan=2, sticky="nsew")
self.b1 = Button(root, text=" Create ", command=self.show_dialog)
self.b1.grid(row=2, column=0, pady=10)
root.rowconfigure(0, weight=3)
root.columnconfigure(0, weight=1)
def show_dialog(self):
self.dialog = Toplevel(root)
self.dialog.title("Child")
# Place child window over the application window
x = self.root.winfo_x() + self.root.winfo_width()//2 - \
self.dialog.winfo_width()//2
y = self.root.winfo_y() + self.root.winfo_height()//2 - \
self.dialog.winfo_height()//2
self.dialog.geometry(f"100x75+{x}+{y}")
Dialog(self.t1, self.dialog)
class Dialog(Toplevel):
def __init__(self, t1, top):
super().__init__(top) # This doesn't work !!!
self.top = top
self.t1 = t1 # Text widget is passed at creation
self.widget()
def widget(self):
self.e1 = Entry(self)
self.e1.grid(row=0, column=0)
self.b1 = Button(self, text="Submit", command=self.on_submit)
self.b1.grid(row=1, column=0, pady=15)
# self.rowconfigure(0, weight=1)
def on_submit(self):
self.t1.insert("insert", self.e1.get())
def quit(self):
self.top.destroy()
root = Tk()
root.title("Paremt")
root.geometry("400x250+400+200")
app = App(root)
app.mainloop()
我更新了这篇文章以显示整个列表。我也试图从下面的评论中改进它。我仍然有副作用。现在它似乎实例化了两个顶级窗口而不仅仅是类。
感谢所有帮助,我在将 Java 中的对象知识应用到 Python/Tk 范例时遇到了困难。现在一切似乎都很好。更新后的清单如下。
from tkinter import *
from tkinter import ttk
class App(Frame):
dialog = None
def __init__(self, root):
super(App, self).__init__(root)
self.create_widgets()
def create_widgets(self):
self.grid(row=3, column=1)
self.t1 = Text(root, wrap="word")
self.t1.grid(row=0, column=0, rowspan=2, sticky="nsew")
self.b1 = Button(root, text=" Create ", command=self.show_dialog)
self.b1.grid(row=2, column=0, pady=10)
root.rowconfigure(0, weight=3)
root.columnconfigure(0, weight=1)
def show_dialog(self):
Dialog(root, self.t1)
def quit(self):
self.destroy()
class Dialog(Toplevel):
def __init__(self, top, t1):
super().__init__(top)
self.t1 = t1 # Text widget is passed at creation
self.title("Child")
# Place child window over the application window
x = root.winfo_x() + root.winfo_width()//2 - self.winfo_width()//2
y = root.winfo_y() + root.winfo_height()//2 - self.winfo_height()//2
self.geometry(f"100x75+{x}+{y}")
self.widget()
self.transient(root) # dialog window is related to main
self.wait_visibility()
def widget(self):
self.e1 = Entry(self)
self.e1.grid(row=0, column=0)
self.b1 = Button(self, text="Submit", command=self.on_submit)
self.b1.grid(row=1, column=0, pady=15)
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
def on_submit(self):
self.t1.insert("insert", self.e1.get())
def quit(self):
self.destroy()
root = Tk()
root.title("Paremt")
root.geometry("400x250+400+200")
app = App(root)
app.mainloop()