加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

导航 – 解决方案:Python3 Tkinter使用后退和下一个按钮从一个

发布时间:2020-12-20 13:28:32 所属栏目:Python 来源:网络整理
导读:我一直在 python3中学习tkinter,发现很难在网上找到好的文档和答案.为了帮助其他人解决同样的问题,我决定发布一个简单问题的解决方案,似乎没有在线文档. 问题:创建一个类似向导的程序,向用户显示一系列窗口,用户可以在窗口之间单击下一步和后退按钮. 解决方
我一直在 python3中学习tkinter,发现很难在网上找到好的文档和答案.为了帮助其他人解决同样的问题,我决定发布一个简单问题的解决方案,似乎没有在线文档.

问题:创建一个类似向导的程序,向用户显示一系列窗口,用户可以在窗口之间单击下一步和后退按钮.

解决方案是:

>创建一个根窗口.
>创建与要呈现给用户的窗口一样多的帧.将所有帧附加到根窗口.
>使用所需的所有小部件填充每个框架.
>当已填充所有帧时,使用grid_forget()方法隐藏每个帧,但不隐藏第一帧以使其成为可见帧.框架上的所有子窗口小部件都将隐藏在框架中.
>当用户单击窗口上的“下一个”或“后退”按钮时,调用隐藏其他帧的子例程(使用grid_forget())并使所需的帧可见(使用grid()).
>如果希望程序结束,请对根窗口使用destroy – 方法.

因此,您将创建一个窗口并在其上显示不同的框架.

(顺便说一句,开始学习tkinter的最佳地点是:http://www.tkdocs.com/tutorial/index.html)

这是Python3中的示例实现.它有3个简单的窗口,每个窗口都有一个文本标签和两个按钮,可以在不同的窗口中导航.

#!/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,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,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,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,sticky=(tkinter.N))
    second_window_next_button = tkinter.Button(second_frame,command = call_third_frame_on_top)
    second_window_next_button.grid(column=1,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,sticky=(tkinter.N))

    # Create the button for the frame
    third_window_back_button = tkinter.Button(third_frame,command = call_second_frame_on_top)
    third_window_back_button.grid(column=0,sticky=(tkinter.N))
    third_window_quit_button = tkinter.Button(third_frame,command = quit_program)
    third_window_quit_button.grid(column=1,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,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,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,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,tkinter.E))

second_frame=tkinter.ttk.Frame(root_window,height=window_heigth)
second_frame['borderwidth'] = 2
second_frame['relief'] = 'sunken'
second_frame.grid(column=0,tkinter.E))

third_frame=tkinter.ttk.Frame(root_window,height=window_heigth)
third_frame['borderwidth'] = 2
third_frame['relief'] = 'sunken'
third_frame.grid(column=0,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 tab,他们谈论对该网站的贡献).

我认为如果用更多的例子来改进这个网站比将这个网站变成一本食谱更好.我认为你也可以为Active State recipes做出贡献,而且他们似乎是Tcl / Tk火炬的载体,所以Tkinter的东西也很有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读