python点击按钮窗口之间跳转_navigation - 解决方案:Python3 Tkinter使用后退和下一个按钮从一个窗口跳转到另一个窗口 - SO中文参考 - www.soinside.co...

我一直在python3中学习tkinter,发现很难在网上找到好的文档和答案。为了帮助其他人解决同样的问题,我决定发布一个简单问题的解决方案,似乎没有在线文档。

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

解决方案是:

创建一个根窗口。

创建与要向用户显示的窗口一样多的帧。将所有帧附加到根窗口。

使用所需的所有小部件填充每个框架。

填充完所有帧后,使用grid_forget()方法隐藏每个帧,但不隐藏第一帧,使其成为可见帧。框架上的所有子窗口小部件都将隐藏在框架中。

当用户单击窗口上的“下一个”或“后退”按钮时,调用隐藏其他帧(使用grid_forget())的子例程,并使所需的帧可见(使用grid())。

如果希望程序结束,请对根窗口使用destroy - 方法。

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

这是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, 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值