解决方案:Python3 Tkinter使用上一个和下一个按钮从一个窗口跳转到另一个窗口 [英] Solution: Python3 Tkinter Jump from one window to another with back and next buttons
问题描述
我一直在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()
方法隐藏每个帧,但不要隐藏第一帧,以使其成为可见的帧.框架上的所有子窗口小部件都将与框架一起隐藏. - 当用户单击窗口上的下一步"或后退"按钮时,调用一个子例程,该子例程隐藏其他框架(使用
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做出贡献(单击其关于标签,然后他们谈论为网站做出贡献.
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).
我认为,最好将该站点改进为更多示例,而不是将其转换为食谱.我认为您也可以为有效状态食谱做出贡献,它们似乎是火炬的载体对于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使用上一个和下一个按钮从一个窗口跳转到另一个窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!