Toplevel 类的面向对象构造函数(无副作用)

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

我在为继承自 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()

我更新了这篇文章以显示整个列表。我也试图从下面的评论中改进它。我仍然有副作用。现在它似乎实例化了两个顶级窗口而不仅仅是类。

python-3.x tkinter object-oriented-analysis toplevel
1个回答
0
投票

感谢所有帮助,我在将 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()
© www.soinside.com 2019 - 2024. All rights reserved.