在另一个 windows (tkinter) 中使用传递的变量

Using the passed variables in another windows (tkinter)

我想创建一个应用来计算网格总数,通过获取 X、Y 和 Z 方向的网格数。我也想在下一个windows中使用要移动的结果。我在下面找到了这个 post,并将其用作我的代码基础。

我可以编写我的代码来计算总网格并在下一个 window 中显示。

import tkinter as tk

class Data:
    def __init__(self):
        self.nx = tk.IntVar()
        self.ny = tk.IntVar()
        self.nz = tk.IntVar()
        self.Tot_grids = tk.IntVar()
        self.A = tk.IntVar()

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title("Test app")
        self.geometry("400x400")

        container = tk.Frame(self)
        container.pack()

        self.data = Data()

        self.frames = {}
        for F in (PageOne, PageTwo):
            frame = F(container, self.data)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.frames[PageOne].button4_P1.config(command=self.go_to_page_two)
        self.show_frame(PageOne)

    def go_to_page_two(self):
        self.show_frame(PageTwo)

    def show_frame(self, c):
        frame = self.frames[c]
        frame.tkraise()

class PageOne(tk.Frame):
    def __init__(self, parent, data):
        super().__init__(parent)
        self.data = data

        self.frame_1 = tk.Frame(self)
        self.frame_1.grid(row=0, column=0)

        self.label_1 = tk.Label(self.frame_1, text="nx")
        self.label_1.grid(row=0, column=0)

        self.entry_1 = tk.Entry(self.frame_1, textvariable=data.nx)
        self.entry_1.grid(row=0, column=1)

        self.label_2 = tk.Label(self.frame_1, text="ny")
        self.label_2.grid(row=1, column=0)

        self.entry_2 = tk.Entry(self.frame_1, textvariable=data.ny)
        self.entry_2.grid(row=1, column=1)

        self.label_3 = tk.Label(self.frame_1, text="nz")
        self.label_3.grid(row=2, column=0)

        self.entry_3 = tk.Entry(self.frame_1, textvariable=data.nz)
        self.entry_3.grid(row=2, column=1)

        def total_grids():
            nt = data.nx.get() * data.ny.get() * data.nz.get()
            self.label_4.config(text=str(nt))
            data.Tot_grids.set(nt)

        self.button1 = tk.Button(self.frame_1, text="Calculate", command=total_grids)
        self.button1.grid(row=3, column=0, columnspan=2)

        self.button4_P1 = tk.Button(self.frame_1, text="Continue")
        self.button4_P1.grid(row=5, column=0, columnspan=4, pady=5)

        self.label_4 = tk.Label(self.frame_1)
        self.label_4.grid(row=4, column=0, columnspan=2)

class PageTwo(tk.Frame):
    def __init__(self, parent, data):
        super().__init__(parent)
        self.data = data

        self.frame2 = tk.Frame(self)
        self.frame2.pack()

        self.label_5 = tk.Label(self.frame2, textvariable=self.data.Tot_grids)
        self.label_5.pack()

app = SampleApp()
app.mainloop()

但是,我不知道如何使用它进行进一步的计算。假设我想做一个简单的计算并通过 100 添加传递的变量。我在 class PageTwo 中添加了几行来做到这一点,但它给了我一个错误。

import tkinter as tk

class Data:
    def __init__(self):
        self.nx = tk.IntVar()
        self.ny = tk.IntVar()
        self.nz = tk.IntVar()
        self.Tot_grids = tk.IntVar()
        self.A = tk.IntVar()

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title("Test app")
        self.geometry("400x400")

        container = tk.Frame(self)
        container.pack()

        self.data = Data()

        self.frames = {}
        for F in (PageOne, PageTwo):
            frame = F(container, self.data)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.frames[PageOne].button4_P1.config(command=self.go_to_page_two)
        self.show_frame(PageOne)

    def go_to_page_two(self):
        self.show_frame(PageTwo)

    def show_frame(self, c):
        frame = self.frames[c]
        frame.tkraise()

class PageOne(tk.Frame):
    def __init__(self, parent, data):
        super().__init__(parent)
        self.data = data

        self.frame_1 = tk.Frame(self)
        self.frame_1.grid(row=0, column=0)

        self.label_1 = tk.Label(self.frame_1, text="nx")
        self.label_1.grid(row=0, column=0)

        self.entry_1 = tk.Entry(self.frame_1, textvariable=data.nx)
        self.entry_1.grid(row=0, column=1)

        self.label_2 = tk.Label(self.frame_1, text="ny")
        self.label_2.grid(row=1, column=0)

        self.entry_2 = tk.Entry(self.frame_1, textvariable=data.ny)
        self.entry_2.grid(row=1, column=1)

        self.label_3 = tk.Label(self.frame_1, text="nz")
        self.label_3.grid(row=2, column=0)

        self.entry_3 = tk.Entry(self.frame_1, textvariable=data.nz)
        self.entry_3.grid(row=2, column=1)

        def total_grids():
            nt = data.nx.get() * data.ny.get() * data.nz.get()
            self.label_4.config(text=str(nt))
            data.Tot_grids.set(nt)

        self.button1 = tk.Button(self.frame_1, text="Calculate", command=total_grids)
        self.button1.grid(row=3, column=0, columnspan=2)

        self.button4_P1 = tk.Button(self.frame_1, text="Continue")
        self.button4_P1.grid(row=5, column=0, columnspan=4, pady=5)

        self.label_4 = tk.Label(self.frame_1)
        self.label_4.grid(row=4, column=0, columnspan=2)

class PageTwo(tk.Frame):
    def __init__(self, parent, data):
        super().__init__(parent)
        self.data = data

        self.frame2 = tk.Frame(self)
        self.frame2.pack()

        self.label_5 = tk.Label(self.frame2, textvariable=self.data.Tot_grids)
        self.label_5.pack()

        self.data.A = self.data.Tot_grids + 100

        self.label_6 = tk.Label(self.frame2, textvariable=self.data.A)
        self.label_6.pack()

app = SampleApp()
app.mainloop()

我也有这个问题,我们真的需要在每个标签、输入字段或按钮之前使用 self 吗?我删除了其中一些,并且代码适用于我的代码。删除它们会导致以后出现问题吗?

您可以使用 tkinter 变量 .trace() 来在 Data.tot_grids 更新时更新 Data.A

class PageTwo(tk.Frame):
    def __init__(self, parent, data):
        super().__init__(parent)
        self.data = data

        self.frame2 = tk.Frame(self)
        self.frame2.pack()

        self.label_5 = tk.Label(self.frame2, textvariable=self.data.Tot_grids)
        self.label_5.pack()

        self.label_6 = tk.Label(self.frame2, textvariable=self.data.A)
        self.label_6.pack()

        # call on_grids_updated() whenever Data.Tot_grids is updated
        self.data.Tot_grids.trace_add('write', self.on_grids_updated)

    def on_grids_updated(self, *args):
        self.data.A.set(self.data.Tot_grids.get() + 100)

关于使用self的问题,如果变量会在其他class方法中被访问,那么你需要在它前面加上self.作为实例变量,否则前缀不是必需的。