千家信息网

Python Tkinter GUI编程怎么实现Frame切换

发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,今天小编给大家分享一下Python Tkinter GUI编程怎么实现Frame切换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完
千家信息网最后更新 2025年11月10日Python Tkinter GUI编程怎么实现Frame切换

今天小编给大家分享一下Python Tkinter GUI编程怎么实现Frame切换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、Frame的tkraise() 方法介绍

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

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

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

frame.tkraise()

2、tkraise用法示例

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

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

第一步,定义一个具有两个静态方法的 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 tkfrom tkinter import ttkfrom tkinter.messagebox import showerrorclass 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 resultclass 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 Tkinter GUI编程怎么实现Frame切换"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

温度 方法 华氏温度 摄氏温度 按钮 切换 两个 知识 篇文章 结果 代码 参数 标签 选择 编程 不同 内容 单位 字典 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全与黑客攻防pdf 虹口区管理软件开发费用是多少 宁波互联网智慧小区软件开发 网络安全技术实验室张小松 vue本地开发代理服务器 杭州软件开发定制 数据库连接的安全认证 获取数据库以上传的照片 抖音添加商品显示服务器打瞌睡 数据库基础与应用综合题 pie软件开发 苏州正规软件开发哪家可靠 安徽正规软件开发销售厂家 软件开发的原则的重要性 河南板式家具数据库 企业网络安全管理员职责 网络安全哪个公司待遇好 下列不属于数据库管理 学软件开发要英语怎么说 怎样用数据库检测文件损坏 shell服务器 大连港隆网络技术有限公司招聘 西安筑波网络技术有限公司 网络技术论文题目 软件开发交付源码 宝山区管理软件开发活动简介 数据库 异地备份 数据库事务的作用和特点 局域网服务器共享管理软件 怎么用r语言在线抓取数据库
0