Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换


Posted in Python onApril 24, 2022

Frame切换

在本文中,将介绍如何使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换。

1、Frame的tkraise() 方法介绍

通常,一个 Tkinter 应用程序由多个Frame组成。 而且您经常需要在Frame之间切换以显示与用户选择相关的Frame。

Tkinter 允许将Frame堆叠在一起。 要显示特定Frame,只需按堆叠顺序将一个放在另一个之上。 顶部Frame将可见。

要将Frame置于顶部,可以使用 Frame 小部件的 tkraise() 方法,如下所示:

frame.tkraise()

2、tkraise用法示例

下面将实现一个温度转换小应用,华氏温度和摄氏温度分别使用两个不同的Frame,UI窗口组成如下:

Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换

ConverterFrame 将有两个实例,一个将温度从华氏温度转换为摄氏温度,另一个将温度从摄氏温度转换为华氏温度:

Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换

第一步,定义一个具有两个静态方法的 TemperatureConverter 类:fahrenheit_to_celsius 和 celsius_to_fahrenheit。

class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f, format=True):
        result = (f - 32) * 5/9
        if format:
            return f'{f} Fahrenheit = {result:.2f} Celsius'
        return result

    @staticmethod
    def celsius_to_fahrenheit(c, format=True):
        result = c * 9/5 + 32
        if format:
            return f'{c} Celsius = {result:.2f} Fahrenheit'
        return result

如果忽略第二个参数或将 True 传递给它们,那么 fahrenheit_to_celsius 和 celsius_to_fahrenheit 方法将返回一个格式化字符串。 否则,他们会将结果作为数字返回。

第二步,定义将显示用于将温度从华氏温度转换为摄氏温度的 UI 的 ConverterFrame,反之亦然。

为此,需要通过将以下参数添加到 __init__() 方法来使 ConverterFrame 更加灵活:

  • 将显示为华氏温度和摄氏度的字符串
  • 用于转换温度的回调函数。
class ConverterFrame(ttk.Frame):
    def __init__(self, container, unit_from, converter):
        super().__init__(container)

        self.unit_from = unit_from
        self.converter = converter

        # field options
        options = {'padx': 5, 'pady': 0}

        # temperature label
        self.temperature_label = ttk.Label(self, text=self.unit_from)
        self.temperature_label.grid(column=0, row=0, sticky='w',  **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, sticky='w', **options)
        self.temperature_entry.focus()

        # button
        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button.grid(column=2, row=0, sticky='w', **options)
        self.convert_button.configure(command=self.convert)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(column=0, row=0, padx=5, pady=5, sticky="nsew")

    def convert(self, event=None):
        """  Handle button click event
        """
        try:
            input_value = float(self.temperature.get())
            result = self.converter(input_value)
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)

    def reset(self):
        self.temperature_entry.delete(0, "end")
        self.result_label.text = ''

上面代码如何工作?

  • 1)使用 unit_from 参数显示温度标签。
  • 2)在 convert() 方法中调用 self.convert 回调将温度从一个单位转换为另一个单位。
  • 3)定义 reset() 方法以在Frame从一个切换到另一个时清除条目小部件和结果标签。

第三,定义一个 ControlFrame 类,该类显示用于选择要显示的Frame的单选按钮。 ControFrame 类继承自 ttk.LabelFrame。

class ControlFrame(ttk.LabelFrame):
    def __init__(self, container):

        super().__init__(container)
        self['text'] = 'Options'

        # radio buttons
        self.selected_value = tk.IntVar()

        ttk.Radiobutton(
            self,
            text='F to C',
            value=0,
            variable=self.selected_value,
            command=self.change_frame).grid(column=0, row=0, padx=5, pady=5)

        ttk.Radiobutton(
            self,
            text='C to F',
            value=1,
            variable=self.selected_value,
            command=self.change_frame).grid(column=1, row=0, padx=5, pady=5)

        self.grid(column=0, row=1, padx=5, pady=5, sticky='ew')

        # initialize frames
        self.frames = {}
        self.frames[0] = ConverterFrame(
            container,
            'Fahrenheit',
            TemperatureConverter.fahrenheit_to_celsius)
        self.frames[1] = ConverterFrame(
            container,
            'Celsius',
            TemperatureConverter.celsius_to_fahrenheit)

        self.change_frame()

    def change_frame(self):
        frame = self.frames[self.selected_value.get()]
        frame.reset()
        frame.tkraise()

上面代码如何工作?

  • 每个单选按钮都有一个值 0 或 1。
  • 创建 ConverterFrame 类的两个实例,一个负责将温度从华氏温度转换为摄氏温度,另一个负责将温度从摄氏温度转换为华氏温度。 另外,定义一个字典来存储这些Frame。 Frame的键与单选按钮的值相同。
  • 单击单选按钮时,会调用 change_frame() 方法根据所选按钮的值从字典中选择相应的Frame。
  • 调用Frame的 reset() 方法来重置输入字段和结果标签。 并且还调用 tkraise() 方法来显示Frame。

第四,定义从 tk.Tk 类继承的 App 类:

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Temperature Converter')
        self.geometry('300x120')
        self.resizable(False, False)

最后,启动程序

if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()

代码整合如下:

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showerror


class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f, format=True):
        result = (f - 32) * 5/9
        if format:
            return f'{f} Fahrenheit = {result:.2f} Celsius'
        return result

    @staticmethod
    def celsius_to_fahrenheit(c, format=True):
        result = c * 9/5 + 32
        if format:
            return f'{c} Celsius = {result:.2f} Fahrenheit'
        return result


class ConverterFrame(ttk.Frame):
    def __init__(self, container, unit_from, converter):
        super().__init__(container)

        self.unit_from = unit_from
        self.converter = converter

        # field options
        options = {'padx': 5, 'pady': 0}

        # temperature label
        self.temperature_label = ttk.Label(self, text=self.unit_from)
        self.temperature_label.grid(column=0, row=0, sticky='w',  **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, sticky='w', **options)
        self.temperature_entry.focus()

        # button
        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button.grid(column=2, row=0, sticky='w', **options)
        self.convert_button.configure(command=self.convert)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(column=0, row=0, padx=5, pady=5, sticky="nsew")

    def convert(self, event=None):
        """  Handle button click event
        """
        try:
            input_value = float(self.temperature.get())
            result = self.converter(input_value)
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)

    def reset(self):
        self.temperature_entry.delete(0, "end")
        self.result_label.text = ''


class ControlFrame(ttk.LabelFrame):
    def __init__(self, container):

        super().__init__(container)
        self['text'] = 'Options'

        # radio buttons
        self.selected_value = tk.IntVar()

        ttk.Radiobutton(
            self,
            text='F to C',
            value=0,
            variable=self.selected_value,
            command=self.change_frame).grid(column=0, row=0, padx=5, pady=5)

        ttk.Radiobutton(
            self,
            text='C to F',
            value=1,
            variable=self.selected_value,
            command=self.change_frame).grid(column=1, row=0, padx=5, pady=5)

        self.grid(column=0, row=1, padx=5, pady=5, sticky='ew')

        # initialize frames
        self.frames = {}
        self.frames[0] = ConverterFrame(
            container,
            'Fahrenheit',
            TemperatureConverter.fahrenheit_to_celsius)
        self.frames[1] = ConverterFrame(
            container,
            'Celsius',
            TemperatureConverter.celsius_to_fahrenheit)

        self.change_frame()

    def change_frame(self):
        frame = self.frames[self.selected_value.get()]
        frame.reset()
        frame.tkraise()


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Temperature Converter')
        self.geometry('480x240')
        self.resizable(False, False)


if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()

运行结果如下:

Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换

 到此这篇关于Python Tkinter GUI编程实现Frame切换的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
Php多进程实现代码
May 07 Python
python实现简单http服务器功能
Sep 17 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python设置环境变量的原因和方法
Jun 24 Python
Python处理session的方法整理
Aug 29 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
基于python3 的百度图片下载器的实现代码
Nov 05 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
Python学习之时间包使用教程详解
Mar 21 Python
在 Python 中利用 Pool 进行多线程
Apr 24 #Python
Python何绘制带有背景色块的折线图
python中Pyqt5使用Qlabel标签播放视频
Apr 22 #Python
Python使用MapReduce进行简单的销售统计
python使用pycharm安装pyqt5以及相关配置
Python使用DFA算法过滤内容敏感词
python游戏开发之pygame实现接球小游戏
Apr 22 #Python
You might like
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
php实现无限级分类
2014/12/24 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
详解js类型判断
2018/05/22 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
python文件读写代码实例
2019/10/21 Python
pygame实现成语填空游戏
2019/10/29 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
详解Python 最短匹配模式
2020/07/29 Python
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
教师年终个人自我评价
2013/10/04 职场文书
数学系个人求职信范文
2014/01/30 职场文书
小学语文国培感言
2014/03/04 职场文书
教育见习报告范文
2014/11/03 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL