tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面

简介: PyQt实现界面与逻辑分离的设计很是方便,详情可以见我的第一篇博文。   不过本文将使用python的标准库 tkinter,来实现界面与逻辑分离的GUI 设计。   我们来设计一个很简单的程序:   目的:长度单位英尺(feet)到米(meter)的转化   实现:输入框输入英尺(feet),标签显示对应的长度米(meter)。

PyQt实现界面与逻辑分离的设计很是方便,详情可以见我的第一篇博文。

 

不过本文将使用python的标准库 tkinter,来实现界面与逻辑分离的GUI 设计。

 

我们来设计一个很简单的程序:

  目的:长度单位英尺(feet)到米(meter)的转化

  实现:输入框输入英尺(feet),标签显示对应的长度米(meter)。可以点击按钮,亦可按回车键。

  说明:界面使用了 ttk.Frame 容器,各个部件的定位皆使用了 grid() 方法,3行3列

                   

  效果:如下

                       

  代码: 眼力好的你一定会发现,下面的代码风格有点像PyQt:

import tkinter as tk
from tkinter import ttk


class Application(tk.Tk): # 继承自 tk.Tk
    '''界面、逻辑分离示例'''
    
    def __init__(self):
        '''初始化'''
        super().__init__() # 有点相当于tk.Tk()
        
        self.createWidgets()

    def createWidgets(self):
        '''界面'''
        self.mainframe = ttk.Frame(self, padding="3 3 12 12") # 注意ttk.Frame()的第一个参数为self,因为这个类继承自tk.Tk类
        self.mainframe.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S))
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)

        # 定义了两个变量(下面会将它们绑定到输入部件 Entry 和标签部件 Label 上)
        # self.feet = StringVar()
        self.feet = tk.DoubleVar()
        self.meters = tk.StringVar()

        # 定义Entry部件,并把它赋给一个变量,方便在别处引用它。
        self.feet_entry = ttk.Entry(self.mainframe, width=7, textvariable=self.feet)
        self.feet_entry.grid(row=1, column=2, sticky=(tk.W, tk.E))
        self.feet_entry.focus()

        # 定义Label部件
        ttk.Label(self.mainframe, textvariable=self.meters).grid(row=2, column=2, sticky=(tk.W, tk.E))
        
        # 定义Button部件
        ttk.Button(self.mainframe, text="Calculate", command=self.calculate).grid(row=3, column=3, sticky=tk.W)

        # 定义三个Label部件
        ttk.Label(self.mainframe, text="feet").grid(row=1, column=3, sticky=tk.W)
        ttk.Label(self.mainframe, text="is equivalent to").grid(row=2, column=1, sticky=tk.E)
        ttk.Label(self.mainframe, text="meters").grid(row=2, column=3, sticky=tk.W)
        
        # 设置每格的 padding
        for child in self.mainframe.winfo_children(): 
            child.grid_configure(padx=5, pady=5)
            
        
        # 给窗口绑定回车键事件
        self.bind('<Return>', self.calculate)

    
    def calculate(self, *args): # 注意:参数必须是带!星!号!的 *args. 否则无论如何都会报类型错误:TypeError
        '''逻辑'''
        try:
            #value = float(self.feet.get()) # 如果前面定义为stringVar: self.feet = StringVar()
            value = self.feet.get()
            self.meters.set('{:.4f}'.format((0.3048 * value * 10000.0 + 0.5)/10000.0))
        except ValueError:
            pass


if __name__ == '__maint__':
    # 实例化Application
    app = Application()
    
    # 设置窗口标题
    app.title("Feet to Meters")
    
    # 主消息循环:
    app.mainloop()

 

 

参考:

http://www.360doc.com/content/14/0328/02/9482_364311622.shtml

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868326118089581a091a04e4c30b2b7896392bdde5c000

目录
相关文章
Pyside6-第八篇-QLabel文本标签
Pyside6-第八篇-QLabel文本标签
819 0
|
存储 自然语言处理 算法
高维向量压缩方法IVFPQ :通过创建索引加速矢量搜索
向量相似性搜索是从特定嵌入空间中的给定向量列表中找到相似的向量。它能有效地从大型数据集中检索相关信息,在各个领域和应用中发挥着至关重要的作用。
749 0
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
554 0
|
4月前
|
弹性计算 运维 网络安全
阿里云轻量应用服务器和ecs区别:适用人群、使用场景、性能差异及限制全方位对比
阿里云轻量应用服务器适用于个人开发者和中小企业,适合网站建设、小型应用等轻量场景,使用门槛低,自带应用镜像和可视化运维;而云服务器ECS面向企业级用户,支持高可用、高容灾和集群类应用,适用于专业级、复杂业务场景。两者在适用人群、业务场景、产品优势及使用限制等方面存在明显差异,用户可根据实际需求选择。
414 0
|
数据可视化 数据处理 Python
如何使用Python实现一个基于均线的交易策略
【10月更文挑战第9天】本文介绍了如何使用Python实现一个基于均线的交易策略。主要步骤包括导入所需库(如`pandas`、`numpy`和`matplotlib`),加载股票或期货的历史数据,计算均线和其他指标,实现交易策略逻辑,以及可视化交易结果。示例代码展示了如何根据均线交叉点进行开仓、止损和止盈操作,并提供了注意事项,如数据来源、交易成本和风险管理。
566 7
|
存储 前端开发 安全
python窗口刷新图片
【4月更文挑战第11天】
265 0
|
存储 编译器 程序员
探索C/C++ main函数传参:成为编程高手的关键步骤
探索C/C++ main函数传参:成为编程高手的关键步骤
624 1
|
网络协议 Linux iOS开发
《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(2)-Wireshark在Windows系统上安装部署
【2月更文挑战第2天】《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(2)-Wireshark在Windows系统上安装部署
469 4
|
存储 缓存 监控
自己整理的Ubuntu NFS常用指令及调优方法
NFS(Network File System)网络文件系统是一种分布式文件系统协议,最初由Sun Microsystems开发,并在1984年首次发布。 NFS允许不同计算机通过网络共享资源,特别是文件和目录,就像它们是本地存储的一部分一样。使用NFS的客户端可以挂载远程服务器上的文件系统,使得用户能够以透明的方式访问远程数据,实现跨多个系统的文件共享。
754 0
|
SQL 关系型数据库 MySQL
[已解决]ERROR tool.ExportTool: Error during export: Export job failed!
[已解决]ERROR tool.ExportTool: Error during export: Export job failed!
554 0