1

脚本的目标:

  • (3) 不同的窗口,每个都在自己的类中,具有自己的小部件和布局,是通过 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()
4

1 回答 1

0

这个问题并不是真正的 Tkinter 问题,而是类与实例的基本问题。实际上,两个相似但不同的问题。您可能需要通读有关类的教程,例如官方 Python 教程中的教程


第一的:

self.master = First_Window

First_Window是一类。您有该类的一个实例app(在名为 的全局变量中),它代表屏幕上的第一个窗口。你可以在那个实例上调用update等等deiconify,因为它代表那个窗口。但First_Window它本身并不代表任何特定的窗口,它只是一个类,一个用于创建代表特定窗口的实例的工厂。所以你不能打电话updatedeiconify上课。

您可能想要做的是通过窗口链向下传递第一个窗口。(或者,您可以访问全局,或执行其他各种操作,但这似乎最干净。)您已经在尝试将其传递给Second_Window,您只需将其存储并在Second_Window( 而不是传递self实例中再次传递它,这是无用的——它只是一个被破坏的窗口对象),然后将它存储起来并在Third_Window.


第二:

Second_Window = Toplevel(self)

而不是创建一个Second_Window类的实例,你只是创建一个泛型Toplevel类的实例,并给它一个本地名称Second_Window(它暂时隐藏了类名……但因为你从不使用那个类,那并不重要) .

当您尝试创建第三个窗口时,您也会遇到同样的问题。


所以:

class First_Window(Frame):
    # ...
    def goto_Second(self):
        # ...
        second = Second_Window(self)

class Second_Window(Toplevel):
    def __init__(self, first, *args):
        Toplevel.__init__(self)
        self.first = first
        # ...

    def goto_Third(self):
        third = Third_Window(self.first)
        self.destroy()

class Third_Window(Toplevel):
    """Highscores are shown with buttons to Startmenu"""
    def __init__(self, first, *args):
        Toplevel.__init__(self)
        self.first = first
        # ...

    def goto_First(self):
        self.first.update()
        self.first.deiconify()
        self.destroy()
于 2014-11-12T22:59:45.433 回答