我在 Python 中使用 Tkinter 来创建计划器。我试图弄清楚如何使用 Tkinter 按钮将变量从一个窗口/类传递到另一个窗口/类。例如,如何将“StartPage”中的字符串变量“user_input”引入“CalendarToday”窗口。将用户从起始页引导至“CalendarToday”页面的按钮是“btn_today”。有什么办法可以让这个按钮将 user_input 变量传递给 'CalendarToday' 类吗?
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.switch_frame(StartPage)
def switch_frame(self, frame_class):
#variable = None
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
class StartPage(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
master.title("My Calendar")
tk.Label(self, text="My Calendar!", font=('Helvetica', 16, "bold")).grid(row = 1, column = 2, pady = 35)
# Today's Calendar button
btn_today = tk.Button(self, text="Today's Calendar", width = 20, height = 3, command=lambda: master.switch_frame(Calendar_Today))
btn_today.grid(row = 3, column = 2, pady = 40, padx = 60)
# Entry Form
entry_form = tk.Entry(self)
entry_form.insert(0, 'Month, Year')
# user_input is the string variable holding the the user's input of month and year.
user_input = entry_form.get()
print(user_input)
entry_form.grid(row = 4, column = 2, pady = 0)
# Specify Calendar button
btn_specify = tk.Button(self, text="Specify month",width = 20, height = 3,command=lambda: master.switch_frame(PageTwo))
btn_specify.grid(row = 5, column = 2, pady = 10)
# Quit button
btn_quit = tk.Button(self, text="Quit App",width = 20, height = 3,command=master.destroy)
btn_quit.grid(row = 6, column = 2, pady = 20)
class Calendar_Today(tk.Frame):
def __init__(self, master):
month_display = month_today + " " + year_today
tk.Frame.__init__(self, master)
master.title(month_display)
lbl_display = tk.Label(self, text= month_display)
lbl_display.grid(row = 1, column = 2)
btn_date1 = tk.Button(self, text="Dates", width = 4, height = 2)
btn_date1.grid(row = 3, column = 2, padx = 10, pady = 10)
########################################
btn_next = tk.Button(self, text="Next Month")
btn_next.grid(row = 8, column = 1, padx = 10, pady = 10)
btn_previous = tk.Button(self, text="Previous Month")
btn_previous.grid(row = 8, column = 2, padx = 10, pady = 10)
btn_return = tk.Button(self, text="Return to Menu",command=lambda: master.switch_frame(StartPage))
btn_return.grid(row = 8, column = 3, padx = 10, pady = 10)
if __name__ == "__main__":
app = SampleApp()
app.title("My Calendar!")
app.mainloop()
答案 0 :(得分:1)
您可以修改 switch_frame()
以接受可选参数并将这些参数传递给页面类:
from tkinter import messagebox
...
class SampleApp(tk.Tk):
...
def switch_frame(self, frame_class, *args, **kw): # added optional arguments
if self._frame:
self._frame.destroy()
self._frame = frame_class(self, *args, **kw) # pass optional arguments to frame class
self._frame.pack()
class StartPage(tk.Frame):
def __init__(self, master):
...
# Today's Calendar button
btn_today = tk.Button(self, text="Today's Calendar", width=20, height=3,
command=self.show_calendar)
btn_today.grid(row=3, column=2, pady=40, padx=60)
...
def show_calendar(self):
user_input = self.entry_form.get().strip()
tokens = user_input.split()
# make sure month and year are specified
# need to do some other validations to make sure valid month and year are input
if len(tokens) == 2:
# pass the user input to Calendar_Today class
self.master.switch_frame(Calendar_Today, *tokens)
else:
messagebox.showerror("Error", f"Invalid input: {user_input}")
class Calendar_Today(tk.Frame):
def __init__(self, master, month_today, year_today): # added month and year arguments
...