Цель сценария:Tkinter Toplevel в сценарии OOP: как?
- (3) различные окна, каждый в своем классе, со своими виджетами и макета, создаются с помощью TopLevel и обратных вызовов.
- Когда создается новое окно (Toplevel), предыдущий уничтожается. Таким образом, только одно окно видимо и активно за раз.
Проблема? В принципе, я пробовал много вещей и не удалось, так что я должен понять слишком мало ["parent", "master", "root", "app", "..."]
:(
Обратите внимание на воспитывающих окна: я реализовал успешный пример загрузки все кадры друг на друга и контролировать их видимость с помощью метода .raise
.
для этой задачи, однако, я не хочу, чтобы загрузить все кадры сразу. Это отведенная версия программы викторины, которая потребует довольно много кадры с изображениями, что заставляет меня неохотно загружать все сразу.
Сценарий(не работает; жучки):
#!/usr/bin/env python
from Tkinter import *
import tkMessageBox, tkFont, random, ttk
class First_Window(Frame):
"""The option menu which is shown at startup"""
def __init__(self, master):
Frame.__init__(self, master)
self.gotosecond = Button(text = "Start", command = self.goto_Second)
self.gotosecond.grid(row = 2, column = 3, sticky = W+E)
def goto_Second(self):
self.master.withdraw()
self.master.update_idletasks()
Second_Window = Toplevel(self)
class Second_Window(Toplevel):
"""The gamewindow with questions, timer and entrywidget"""
def __init__(self, *args):
Toplevel.__init__(self)
self.focus_set()
self.gotothird = Button(text = "gameover", command = self.goto_Third)
self.gotothird.grid(row = 2, column = 3, sticky = W+E)
def goto_Third(self):
Third_Window = Toplevel(self)
self.destroy()
class Third_Window(Toplevel):
"""Highscores are shown with buttons to Startmenu"""
def __init__(self, *args):
Toplevel.__init__(self)
self.focus_set()
self.master = First_Window
self.gotofirst = Button(text = "startover", command = self.goto_First)
self.gotofirst.grid(row = 2, column = 3, sticky = W+E)
def goto_First(self):
self.master.update()
self.master.deiconify()
self.destroy()
def main():
root = Tk()
root.title("Algebra game by PJK")
app = First_Window(root)
root.resizable(FALSE,FALSE)
app.mainloop()
main()
Какую ошибку вы получаете? – twasbrillig
С помощью этого сценария первый экран загружается просто отлично. Нажатие на кнопку (goto_Second) откроет новое окно, которое ничего не отобразит. Закрытие этого окна также не закрывает программу (так как я должен закрыть окно терминала тоже). – Pjay
Вы можете использовать 'self.top = Toplevel (self)' внутри вашего класса 'First_Window', а затем просто' self.top.destroy() 'при создании нового окна. Для виджетов, которые будут присутствовать в окне Toplevel, вы можете сделать 'self.some_button = Button (self.top, text = 'Start', command = self.goto_Second)', чтобы виджет использовал 'self.top' как родитель. – DuckPuncher