我想創建一個應用程式來計算網格總數,通過獲取 X、Y 和 Z 方向的網格數。我還想使用結果在下一個視窗中移動。我在下面找到了這篇文章,并將其用作我的代碼基礎。
如何通過使用 tkinter 在第一頁中匯入該文本檔案來將文本檔案中的數字傳輸到下一頁?
我可以撰寫代碼來計算總網格并將其顯示在下一個視窗中。
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。我在課堂上添加了幾行來做到這一點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在每個標簽、輸入欄位或按鈕之前使用嗎?我洗掉了其中一些,并且該代碼適用于我的代碼。洗掉它們會導致以后出現問題嗎?
uj5u.com熱心網友回復:
您可以使用 tkinter 變數.trace()在更新Data.A時Data.tot_grids進行更新:
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)
關于 using的問題self,如果該變數將在其他類方法中被訪問,則需要在其前加上前綴,self.使其成為實體變數,否則前綴不是必需的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425919.html
下一篇:self.login_button=tk.Button(self,command=lambda:master.show_frame())AttributeError:'Frame'
