在另一个 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.
作为实例变量,否则前缀不是必需的。
我想创建一个应用来计算网格总数,通过获取 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.
作为实例变量,否则前缀不是必需的。