<p>这里有一些演示代码,作为你的游戏结构的一个例子。在本例中,屏幕上会清除所有按钮、标签和条目,然后您必须在下一个场景中创建新的按钮、标签和条目。这支持具有不同布局的场景。如果您希望每个场景都有一个按钮、一个标签和一个条目,您可以更改此结构以节省创建小部件的工作量。试着运行这段代码看看它做了什么,然后查看代码和注释以了解它是如何工作的</p>
<pre class="lang-py prettyprint-override"><code>import tkinter as tk
class Window():
def __init__(self, master):
self.master = master
self.master.geometry('300x300') # Sets the dimensions of the window
self.dark_room() # Goes to the first scene, which is created by the function dark_room below
def new_scene(self, scene, frame, *args):
# This function will act as a directory, erasing the previous buttons and labels and going to the next function
frame.destroy() # Destroys the previous frame, which holds all buttons, labels, entries, etc
goto = { # A dictionary with references to all your scenes. Add each new scene function to here
'dark_room': self.dark_room,
'light_room': self.light_room,
'intro': self.intro
}
if args:
text = args[0]
goto[scene](text)
else:
goto[scene]()
def dark_room(self, text='You wake up in a dark room. There are matches next to you.'):
frame = tk.Frame(self.master) # Place a frame in the window, and then make labels/buttons on it. It makes it easier to clear them later
frame.pack()
label_text = tk.StringVar() # Use a StringVar to make a label that can have its text changed
label_text.set(text) # Be sure to change text using the .set() command. Don't use label_text = 'some text'
tk.Label(frame, textvariable=label_text, wraplength=200).pack()
tk.Button(frame, text='Look for door', command=lambda: self.new_scene('dark_room', frame, "It's too dark to see.")).pack()
tk.Button(frame, text='Light a match', command=lambda: self.new_scene('light_room', frame)).pack()
def light_room(self, text='The match lights up the room. What is your name?'):
frame = tk.Frame(self.master)
frame.pack()
tk.Label(frame, text=text, wraplength=200).pack()
name = tk.StringVar()
tk.Entry(frame, textvariable=name).pack() # This entry is linked to the StringVar called name. name.get() will give you the contents of entry
tk.Button(frame, text='Submit', command=lambda: self.new_scene('intro', frame, name.get())).pack() # Notice we use name.get()
def intro(self, name):
frame = tk.Frame(self.master)
frame.pack()
tk.Label(frame, text='Your name is %s, the fearless adventurer!' % name, wraplength=200).pack()
root = tk.Tk()
Window(root)
root.mainloop()
</code></pre>