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

1、Frame的tkraise() 方法介绍

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

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

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

frame.tkraise()

登录后复制

2、tkraise用法示例

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

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

立即学习“Python免费学习笔记(深入)”;

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

Python Tkinter GUI编程怎么实现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 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切换

以上就是Python Tkinter GUI编程怎么实现Frame切换的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2236469.html

(0)
上一篇 2025年2月26日 18:30:11
下一篇 2025年2月18日 08:02:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python中的枚举怎么实现

    使用普通类直接实现枚举 在Python中,枚举和我们在对象中定义的类变量时一样的,每一个类变量就是一个枚举项,访问枚举项的方式为:类名加上类变量,像下面这样: class color():    YELLOW  = 1    RED    …

    编程技术 2025年2月26日
    200
  • Python怎么利用Turtle绘制哆啦A梦和小猪佩奇

    1.哆啦A梦 “只要把愿望系在竹竿上请求月亮女神,心愿便能达成”。我超喜欢这句话。 哆啦A梦的创造要追溯到1969年的某个截稿日,作者藤子·F·不二雄的家里突然闯进了一只小猫,虽然很快就要截稿了,但作者还是和小猫玩了起来,还替小猫挠虱子,而…

    2025年2月26日
    200
  • Python的Try和Except怎么使用

    try 块允许您测试代码块以查找错误。 except 块允许您处理错误。 finally 块允许您执行代码,无论 try 和 except 块的结果如何。 异常处理 当我们调用 Python 并发生错误或异常时,通常会停止并生成错误消息。 …

    2025年2月26日 编程技术
    200
  • 为什么 Python、Ruby 等语言弃用了自增运算符?

    许多人也许会注意到一个现象,那就是在一些现代编程语言(当然,并不是指“最近出现”的编程语言)中,自增和自减运算符被取消了。也就是说,在这些语言中不存在​​i++​​​或​​j–​​​这样的表达,而是只存在​​i += 1​​​或…

    2025年2月26日
    200
  • Python的正则表达式怎么实现

    Python 正则表达式 正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,基本上我们所使用的编程语言都提供了对它的实现,当然了,各家的实现也是有一些差异的,有的支持的功能多一点,有的支持的少一点。 因为正则表达式是实践中使用广…

    2025年2月26日
    200
  • Python中if语句的基本格式是什么

    在 python 中,if 语句用于根据条件执行不同的代码块。它的基本格式如下: if condition:    # 如果 condition 为 True,执行这里的代码块 登录后复制 其中,condition 是一个表达式,通常涉及变…

    编程技术 2025年2月26日
    200
  • Python中json库的操作方法有哪些

    概念 json是一种通用的数据类型 一般情况下接口返回的数据类型都是json 长得像字典,形式也是k-v{ } 其实json是字符串 字符串不能用key、value来取值,所以要先转换为字典才可以 立即学习“Python免费学习笔记(深入)…

    编程技术 2025年2月26日
    200
  • 怎么使用python实现一个简单的贪吃蛇游戏

    pygame 写的“贪吃蛇”小游戏: “贪吃蛇”这个小游戏在编程学习中的常客,因为: 简单,最基本的游戏元素只需要蛇和食物两个就可以进行了。(打飞机还需要三个元素呢,想想分别是什么?)方向的话只要上下左右4个固定方向就可以了。有基本的数据结…

    2025年2月26日
    200
  • Python怎么利用手势识别实现贪吃蛇游戏

    项目介绍 1、游戏的操作方式 贪吃蛇游戏人尽皆知,计算机视觉鲜为人知,计算机视觉+贪吃蛇游戏会带给人们更多的参与感以及新鲜度,本次这个项目就是主要使用手势识别来完成贪吃蛇这个简单的游戏。在这个游戏中,电脑通过摄像头捕捉到我们的手势并判别是否…

    2025年2月26日
    200
  • python OpenCV图像金字塔实例分析

    1.图像金字塔理论基础 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条…

    2025年2月26日 编程技术
    200

发表回复

登录后才能评论