问题描述
我一直在研究 python3 中的 tkinter,发现很难在网上找到好的文档和答案.为了帮助解决同样问题的其他人,我决定针对一个似乎没有在线文档的简单问题发布解决方案.
I've been studying tkinter in python3 and find it very hard to find good documentation and answers online. To help others struggling with the same problems I decided to post a solution for a simple problem that there seems to be no documentation for online.
问题:创建一个类似向导的程序,向用户显示一系列窗口,用户可以在窗口之间移动,点击下一步和返回 - 按钮.
Problem: Create a wizard-like program, that presents the user with a series of windows and the user can move between the windows clicking next and back - buttons.
解决办法是:
- 创建一个根窗口.
- 创建尽可能多的框架以呈现给用户.将所有框架附加到根窗口.
- 用它需要的所有小部件填充每个框架.
- 当所有帧都被填充后,使用
grid_forget()
方法隐藏每个帧,但不隐藏第一帧,使其变为可见帧.框架上的所有子小部件都将与框架一起隐藏. - 当用户点击窗口上的 Next 或 Back 按钮时,调用一个隐藏其他框架的子例程(使用
grid_forget()
)并使需要的框架可见(使用grid()
). - 当您希望程序结束时,对根窗口使用 destroy - 方法.
- Create one root window.
- Create as many frames as you have windows to present to the user. Attach all frames to the root window.
- Populate each frame with all the widgets it needs.
- When all the frames have been populated, hide each frame with the
grid_forget()
method but leave the first frame unhidden so that it becomes the visible one. All the child widgets on the frame will be hidden with the frame. - When the user clicks on Next or Back buttons on a window, call a subroutine that hides other frames (with
grid_forget()
) and makes the one that is needed visible (withgrid()
). - When you want the program to end, use the destroy - method for the root window.
因此,您将创建一个窗口并在其上显示不同的框架.
So you will be creating a single window and showing different frames on it.
(顺便说一句,开始学习 tkinter 的最佳地点是:http://www.tkdocs.com/tutorial/index.html)
(By the way, the best place to start studying tkinter is: http://www.tkdocs.com/tutorial/index.html)
这是 Python3 中的示例实现.它有 3 个简单的窗口,每个窗口都有一个文本标签和两个用于在不同窗口中导航的按钮.
Here is a sample implementation in Python3. It has 3 simple windows, each with a text label and two buttons to navigate through different windows.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Creates three "windows" that the user can navigate through using Back and Next - buttons.
import tkinter
import tkinter.ttk
def create_widgets_in_first_frame():
# Create the label for the frame
first_window_label = tkinter.ttk.Label(first_frame, text='Window 1')
first_window_label.grid(column=0, row=0, pady=10, padx=10, sticky=(tkinter.N))
# Create the button for the frame
first_window_quit_button = tkinter.Button(first_frame, text = "Quit", command = quit_program)
first_window_quit_button.grid(column=0, row=1, pady=10, sticky=(tkinter.N))
first_window_next_button = tkinter.Button(first_frame, text = "Next", command = call_second_frame_on_top)
first_window_next_button.grid(column=1, row=1, pady=10, sticky=(tkinter.N))
def create_widgets_in_second_frame():
# Create the label for the frame
second_window_label = tkinter.ttk.Label(second_frame, text='Window 2')
second_window_label.grid(column=0, row=0, pady=10, padx=10, sticky=(tkinter.N))
# Create the button for the frame
second_window_back_button = tkinter.Button(second_frame, text = "Back", command = call_first_frame_on_top)
second_window_back_button.grid(column=0, row=1, pady=10, sticky=(tkinter.N))
second_window_next_button = tkinter.Button(second_frame, text = "Next", command = call_third_frame_on_top)
second_window_next_button.grid(column=1, row=1, pady=10, sticky=(tkinter.N))
def create_widgets_in_third_frame():
# Create the label for the frame
third_window_label = tkinter.ttk.Label(third_frame, text='Window 3')
third_window_label.grid(column=0, row=0, pady=10, padx=10, sticky=(tkinter.N))
# Create the button for the frame
third_window_back_button = tkinter.Button(third_frame, text = "Back", command = call_second_frame_on_top)
third_window_back_button.grid(column=0, row=1, pady=10, sticky=(tkinter.N))
third_window_quit_button = tkinter.Button(third_frame, text = "Quit", command = quit_program)
third_window_quit_button.grid(column=1, row=1, pady=10, sticky=(tkinter.N))
def call_first_frame_on_top():
# This function can be called only from the second window.
# Hide the second window and show the first window.
second_frame.grid_forget()
first_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
def call_second_frame_on_top():
# This function can be called from the first and third windows.
# Hide the first and third windows and show the second window.
first_frame.grid_forget()
third_frame.grid_forget()
second_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
def call_third_frame_on_top():
# This function can only be called from the second window.
# Hide the second window and show the third window.
second_frame.grid_forget()
third_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
def quit_program():
root_window.destroy()
###############################
# Main program starts here :) #
###############################
# Create the root GUI window.
root_window = tkinter.Tk()
# Define window size
window_width = 200
window_heigth = 100
# Create frames inside the root window to hold other GUI elements. All frames must be created in the main program, otherwise they are not accessible in functions.
first_frame=tkinter.ttk.Frame(root_window, width=window_width, height=window_heigth)
first_frame['borderwidth'] = 2
first_frame['relief'] = 'sunken'
first_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
second_frame=tkinter.ttk.Frame(root_window, width=window_width, height=window_heigth)
second_frame['borderwidth'] = 2
second_frame['relief'] = 'sunken'
second_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
third_frame=tkinter.ttk.Frame(root_window, width=window_width, height=window_heigth)
third_frame['borderwidth'] = 2
third_frame['relief'] = 'sunken'
third_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
# Create all widgets to all frames
create_widgets_in_third_frame()
create_widgets_in_second_frame()
create_widgets_in_first_frame()
# Hide all frames in reverse order, but leave first frame visible (unhidden).
third_frame.grid_forget()
second_frame.grid_forget()
# Start tkinter event - loop
root_window.mainloop()
推荐答案
因为您冒昧地将答案作为问题发布.我想发表评论作为答案,并建议您也许应该将其贡献给 TkDocs(单击他们的 About标签,他们谈论对网站的贡献).
As you've taken the liberty to post an answer as a question. I'd like to post a comment as an answer and suggest that perhaps you should contribute this to TkDocs (click their About tab and they talk about contributing to the site).
我认为最好通过更多示例来改进该网站,而不是将该网站变成一本食谱.我想你也可以为 Active State recipes 做出贡献,他们似乎是火炬的携带者对于 Tcl/Tk,所以 Tkinter 的东西在那里也很有意义.
I think it'd be better if that site were to improved with more examples than to turn this site into a cookbook. I think you can also contribute to the Active State recipes, and they seem to be the carriers of the torch for Tcl/Tk, so Tkinter stuff makes a lot of sense there too.
这篇关于解决方案:Python3 Tkinter 使用返回和下一步按钮从一个窗口跳转到另一个窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!