[英]Tkinter Toplevel in OOP script: how?
脚本目标:
问题? 基本上,我已经尝试了很多事情并失败了,所以我必须对["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
的全局变量中),该实例表示屏幕上的第一个窗口。 您可以在该实例上调用update
和deiconify
等,因为它表示该窗口。 但是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.