Ткинтер как сбросить окно / фрейм в мультикадровом приложении? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь написать простой графический интерфейс для игры в угадайку в 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 - игра «ставится на паузу» в последней попытке, и я хочу, чтобы это было: каждый раз, когда кнопка выходаНажатие фрейма должно сбрасываться само.И вот вопрос - есть ли способ отследить, какой фрейм в данный момент находится сверху, или проверить, меняется ли фрейм так, что каждый раз, когда это происходит, все возвращается в состояние по умолчанию.Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...