繁体   English   中英

OOP脚本中的Tkinter Toplevel:如何?

[英]Tkinter Toplevel in OOP script: how?

脚本目标:

  • (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()

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


第一:

self.master = First_Window

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

您可能想要做的是将第一个窗口向下通过一系列窗口。 (或者,您可以访问全局对象,或执行其他各种操作,但这似乎是最干净的方法。)您已经在尝试将其传递给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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM