Я пытаюсь написать простой графический интерфейс для игры в угадайку в Tkinter, и я борюсь с одной конкретной вещью.Я использую решение из этой темы: Переключение между двумя кадрами в tkinter
То, чего я хочу достичь, - это иметь возможность выйти в любой момент, используя кнопку выхода, отображаемую на каждомстраница таким образом, что каждый раз, когда нажимается кнопка выхода, кадры сбрасываются.Например, вот часть моего кода:
class Window(tk.Tk):
def __init__(self, master = None):
tk.Tk.__init__(self, master)
tk.Tk.wm_title(self, 'Guessing Game')
tk.Tk.resizable(self, width=False, height=False)
self.min = 0
self.max = 10
self.frameName = tk.StringVar()
container = tk.Frame(self)
container.pack(side = 'top', fill = 'both', expand=True)
container.grid_rowconfigure(0,weight = 1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
frames = (menuPage, SettingsPage, userPlayPage, compPlayPage)
for F, geometry in zip((frames),['300x300']*len(frames)):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = (frame, geometry)
frame.grid(row = 0, column = 0, sticky = 'nsew')
self.show_frame('menuPage')
def show_frame(self,cont):
frame, geometry = self.frames[cont]
self.update_idletasks()
self.geometry(geometry)
self.frameName.set(cont)
lowerFrame = tk.Frame(self)
lowerFrame.place(relx = 0.1, rely = 0.8, width = 250)
text, func = ('Quit', exit) if cont == 'menuPage' else ('Back', lambda: self.show_frame('menuPage'))
quitBtn = ttk.Button(lowerFrame, text = text, width = 25,
command = func)
quitBtn.pack(side = tk.BOTTOM)
frame.tkraise()
class menuPage (tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
centerFrame = tk.Frame(self)
centerFrame.place(relx = 0.1, rely = 0.1, relwidth = 0.8)
userPlay = ttk.Button(centerFrame, text = 'Play' , width = 25,
command = lambda: controller.show_frame('userPlayPage'))
userPlay.pack(side=tk.TOP)
compPlay = ttk.Button(centerFrame, text = 'Play with computer' , width = 25,
command = lambda: controller.show_frame('compPlayPage'))
compPlay.pack(side=tk.TOP)
settingsBtn = ttk.Button(centerFrame, text = 'Settings' , width = 25,
command = lambda: controller.show_frame('SettingsPage'))
settingsBtn.pack(side=tk.TOP)
class userPlayPage (tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
textFrame = tk.Frame(self)
textFrame.place(relx = 0.1, rely = 0.1, relwidth = 0.8, relheight = 0.2)
self.T = tk.Text(textFrame, height = 20, width = 100)
self.T.pack()
btnFrame = tk.Frame(self)
btnFrame.place(relx = 0.1, rely = 0.3, relwidth = 0.8)
min, max = controller.min, controller.max
self.e1 = tk.Entry(btnFrame, width = 17)
self.e1.grid(row=0,column=1)
self.btnInsert = tk.Button(btnFrame, width = 10, text = 'Insert', command = (lambda: self.Guess(self.e1.get(), controller, min, max)))
self.btnInsert.grid(row=0)
self.guess = tk.IntVar()
text = ('Guessing Game!\n', 'Guess a number between {} and {}\n'.format(min, max))
for t in text:
self.T.insert(tk.END, t)
self.number = tk.IntVar()
self.number.set(random.randint(min, max))
def Guess(self, guess, controller, min, max):
self.T.delete(3.0, tk.END)
self.guess.set(guess)
if self.guess.get() < self.number.get():
self.T.insert(tk.END, "Aim higher")
elif int(self.guess.get()) > self.number.get():
# self.T.delete(3.0, tk.END)
self.T.insert(tk.END, "Aim lower")
elif int(self.guess.get()) == self.number.get():
self.T.insert(tk.END, "You\'ve guessed")
self.after(2000, lambda: self.T.delete(3.0, tk.END))
newguess = random.randint(min, max)
self.after(2000, lambda: self.number.set(newguess))
self.after(2000, lambda: controller.show_frame('menuPage'))
Каждый раз, когда я нажимаю кнопку «Воспроизвести» в меню «Страница», я поднимаю страницу «Кадр меню».Затем игра запускается, создается новое предположение, и вы можете играть в игру в угадывание, пока не угадаете ее правильно - и это работает.Но когда я нажимаю кнопку выхода во время игры, фрейм переключается обратно на menuPage, а затем, когда я снова поднимаю userPlayPage - игра «ставится на паузу» в последней попытке, и я хочу, чтобы это было: каждый раз, когда кнопка выходаНажатие фрейма должно сбрасываться само.И вот вопрос - есть ли способ отследить, какой фрейм в данный момент находится сверху, или проверить, меняется ли фрейм так, что каждый раз, когда это происходит, все возвращается в состояние по умолчанию.Спасибо за любую помощь.