Python GUI设计界面框架应用(一)

Python图形界面GUI程序设计 1、GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图... 阅读详情

Python GUI 界面设计

获取用户输入的SOURCE_DIR、TARGET_DIR和DATE,并包含路径自动校正、日期验证功能和多线程实现任务功能。

框架设计灵活,根据实际需求替换main_processing_function中的处理逻辑,而不需要修改GUI部分的代码。

import tkinter as tk
from tkinter import ttk, messagebox
import re
import os
import sys
from datetime import datetime, timedelta
import calendar
import threading

class PathDateInputApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数据处理工具")
        self.root.geometry("500x250")
        self.root.resizable(True, True)
        
        # 设置协议,当窗口关闭时调用safe_exit
        self.root.protocol("WM_DELETE_WINDOW", self.safe_exit)
        
        # 设置主框架
        main_frame = ttk.Frame(root, padding="20")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 配置网格权重
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        
        # 创建输入字段
        ttk.Label(main_frame, text="源路径:").grid(row=0, column=0, sticky=tk.W, pady=5)
        self.source_dir = ttk.Entry(main_frame, width=50)
        self.source_dir.grid(row=0, column=1, sticky=(tk.W, tk.E), pady=5, padx=(10, 0))
        
        ttk.Label(main_frame, text="目标路径:").grid(row=1, column=0, sticky=tk.W, pady=5)
        self.target_dir = ttk.Entry(main_frame, width=50)
        self.target_dir.grid(row=1, column=1, sticky=(tk.W, tk.E), pady=5, padx=(10, 0))
        # 添加示例文本
        ttk.Label(main_frame, text="路径示例: C:\\Users\\J\\input", foreground="gray").grid(row=2, column=0, columnspan=2, pady=5, sticky=tk.W)
        
        ttk.Label(main_frame, text="日期 (YYYYMMDD):").grid(row=3, column=0, sticky=tk.W, pady=5)
        self.date_entry = ttk.Entry(main_frame, width=50)
        self.date_entry.grid(row=3, column=1, sticky=(tk.W, tk.E), pady=5, padx=(10, 0))
        
        # 添加示例文本
        ttk.Label(main_frame, text="日期示例: 20250630", foreground="gray").grid(row=4, column=0, columnspan=2, pady=5, sticky=tk.W)
        
        # 按钮框架
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=5, column=0, columnspan=2, pady=20)
        
        # 定义处理按钮并保存到self.process_button
        self.process_button = ttk.Button(button_frame, text="处理", command=self.process_data)
        self.process_button.pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="清除", command=self.clear_fields).pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="退出", command=self.safe_exit).pack(side=tk.LEFT, padx=5)

        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪")
        status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
        status_bar.grid(row=1, column=0, sticky=(tk.W, tk.E))
        
        # 处理线程
        self.processing_thread = None
        self.is_processing = False
        
    def normalize_path(self, path):
        """自动校正路径格式"""
        # 移除引号
        path = re.sub(r'^["\']|["\']$', '', path.strip())
        
        # 统一斜杠格式
        path = path.replace('/', '\\')
        path = path.replace('\\\\', '\\')
        
        return path
    
    def validate_date(self, date_str):
        """验证日期格式和有效性"""
        # 检查格式
        if not re.match(r'^\d{8}$', date_str):
            return False, "日期必须为YYYYMMDD格式"
        
        try:
            # 尝试解析日期
            year = int(date_str[:4])
            month = int(date_str[4:6])
            day = int(date_str[6:8])
            
            date_obj = datetime(year, month, day)
            
            # 检查是否为月末
            last_day = calendar.monthrange(year, month)[1]
            if day != last_day:
                return False, f"日期不是月末,最后一天是{last_day}"
                
            return True, date_obj
        except ValueError as e:
            return False, f"无效日期: {str(e)}"
    
    def process_data(self):
        """处理数据的主函数"""
        # 如果正在处理中,则不执行新的处理
        if self.is_processing:
            return
            
        # 获取输入值
        source_dir = self.source_dir.get()
        target_dir = self.target_dir.get()
        date_str = self.date_entry.get()
        
        # 验证输入
        if not all([source_dir, target_dir, date_str]):
            messagebox.showerror("错误", "所有字段均为必填")
            return
        
        # 校正路径
        try:
            source_dir = self.normalize_path(source_dir)
            target_dir = self.normalize_path(target_dir)
        except Exception as e:
            messagebox.showerror("错误", f"路径校正失败: {str(e)}")
            return
        
        # 验证日期
        is_valid, date_result = self.validate_date(date_str)
        if not is_valid:
            messagebox.showerror("错误", date_result)
            return
        
        # 更新状态
        self.status_var.set("处理中...")
        self.process_button.config(state="disabled")
        self.is_processing = True
        
        # 在新线程中运行处理函数,避免界面冻结
        self.processing_thread = threading.Thread(
            target=self.run_processing, 
            args=(source_dir, target_dir, date_result),
            daemon=True
        )
        self.processing_thread.start()
        
        # 定期检查处理是否完成
        self.check_processing_status()
    
    def run_processing(self, source_dir, target_dir, date_obj):
        """在新线程中运行处理函数"""
        try:
            # 调用主处理函数
            result = main_processing_function(source_dir, target_dir, date_obj)
            
            # 使用线程安全的方式更新GUI
            self.root.after(0, lambda: self.processing_complete(True, result))
            
        except Exception as e:
            # 使用线程安全的方式更新GUI
            self.root.after(0, lambda: self.processing_complete(False, str(e)))
    
    def check_processing_status(self):
        """定期检查处理状态"""
        if self.is_processing and self.processing_thread.is_alive():
            # 如果仍在处理中,继续检查
            self.root.after(100, self.check_processing_status)
        elif self.is_processing:
            # 如果线程已结束但状态未更新,强制更新
            self.processing_complete(False, "处理被中断")
    
    def processing_complete(self, success, message):
        """处理完成后的回调函数"""
        self.is_processing = False
        self.process_button.config(state="normal")
        
        if success:
            messagebox.showinfo("成功", f"处理成功完成!\n{message}")
            self.status_var.set("就绪")
        else:
            messagebox.showerror("错误", f"处理失败: {message}")
            self.status_var.set("发生错误")
    
    def clear_fields(self):
        """清除所有输入字段"""
        self.source_dir.delete(0, tk.END)
        self.target_dir.delete(0, tk.END)
        self.date_entry.delete(0, tk.END)
        self.status_var.set("字段已清除")
    
    def safe_exit(self):
        """安全退出应用程序"""
        if self.is_processing:
            if messagebox.askyesno("确认退出", 
                                  "正在处理中,确定要退出吗?"):
                self.root.destroy()
                sys.exit(0)
        else:
            self.root.destroy()
            sys.exit(0)

# 主要处理函数 - 可以替换为实际的处理逻辑
def main_processing_function(source_dir, target_dir, date_obj):
    """
    主要处理函数 - 替换为实际的数据处理逻辑
    
    参数:
        source_dir (str): 源目录路径
        target_dir (str): 目标目录路径
        date_obj (datetime): 日期对象
    
    返回:
        str: 处理结果信息
    """
    # 这里可以替换为实际的数据处理代码
    result = f"从 {source_dir} 到 {target_dir} 的数据已处理,日期为 {date_obj.strftime('%Y-%m-%d')}"
    
    # 模拟处理时间
    import time
    time.sleep(2)
    
    return result

def main():
    """主函数"""
    root = tk.Tk()
    app = PathDateInputApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

功能说明

  1. 路径自动校正:

    • 移除路径字符串开头和结尾的引号
    • 将正斜杠(/)和双反斜杠(\\)统一转换为单反斜杠(\)
    • 处理各种不规范的路径输入格式
  2. 日期验证:

    • 检查日期格式是否为YYYYMMDD
    • 验证日期是否有效(如2月30日会被拒绝)
    • 检查日期是否为该月的最后一天
  3. GUI界面:

    • 示例文本提示用户正确格式
    • 状态栏显示当前操作状态
    • 响应式布局,窗口可调整大小
  4. 自由替换主要处理函数:

    • main_processing_function 可以替换为实际的数据处理逻辑
    • 提供了清晰的参数说明和返回格式

学习和参考的操作手册

  1. tkinter模块教程 - Python图形编程
2021年开发Python图形用户界面(GUI)的6种最佳Python GUI框架 几个知名的编程语言排行榜索引已证明了Python在全球开发人员中的崛起。但是,以开发人员为中心的英国分析家SlashData现在已经对使用该语言的开发人员的实际人数进行了估算。 根据SlashData在2019年的统计,目前全球有820万使用Python进行编码的开发人员,而这一数字现已超过使用Java进行开发的人数,即760万。在2018年9月,有700万Python开发人员和710万Java开发人员。 此外,Python具有从Web开发到桌面图形用户界面(GUI)的广泛应用程序。Python... 阅读详情

相关推荐

利用Python的PyQt5编写GUI界面教学

由于学校课程的项目,最近最近在学习如何利用Python语言和SQL Server编写一个读者图书借阅、查询管理的小程序。以此为契机吧,自己便开始了学习之路~ 这篇文章主要介绍自己如何使用PyQt5编写GUI界面。 自己使用到的工具 VS Code PyQt5依赖包 Qt Designer Python几种常见的GUI库 Tkinter Tkinter是Python自带的量轻级的简单GUI库,使用也较为简单。但是Tkinter之适用于基础和小型程序的开发,界面的美观程度也相对有限。 在网上找到了比较全面介

星云随风 倚码为诗 1万+

终极Python GUI开发指南:DearPyGui让界面构建像搭积木一样简单

亲爱的Python开发者们,如果你还在为复杂的GUI开发而头疼,那么今天我要向你介绍一个革命性的工具——DearPyGui。这个快速而强大的图形用户界面工具包正在彻底改变Python界面开发的游戏规则!🚀 ## 什么是DearPyGui?为什么它如此特别? **DearPyGui**是一个基于C++和Python的现代GUI框架,它采用了即时模式(Immediate Mode)的设计理念,让

gitblog_00042的博客 383

Python GUI界面编程-初识

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。然而这界面若要通过在显示屏的特定位置,以"各种美观而不单调的视觉消息"提示用户"状态的改变",势必得比简单的消息呈现花上更多的计算能力。 GUI概述 图形用户界面(Graphical...

永远在学习Linux之路上 6062

Python GUI终极指南:5步掌握DearPyGui的完整开发流程

还在为Python图形界面开发的复杂性而烦恼吗?是否经历过传统GUI框架的冗长代码和性能瓶颈?今天,让我为你介绍一款革命性的解决方案——DearPyGui,它将彻底改变你对Python GUI开发的认知! DearPyGui是一个基于现代C++和GPU渲染的高性能Python GUI框架,采用即时模式架构,让界面开发变得前所未有的简单高效。无论你是Python新手还是资深开发者,都能在短短几分钟

gitblog_00531的博客 1017

python GUI软件界面设计

使用python的tkinter模拟“友善串口助手”界面 使用python 自带的GUI库tkinter,模仿“友善串口助手”设计一个串口工具,工具使用了稍微复杂的界面,tkinter库中常用的控件大部分在应用中有调用。所以用本文记录各控件的使用方法,方便各网友查询、参考。 注:代码中只有UI部分,仅供各位网友参考tkinter库的使用。有部分个人编写的模块未在此上传,若直接拷贝以下代码需稍作修...

在水一[钫] 2154

PYTHON实践——GUI界面

摘 要 基于easygui,Wordcloud等一系列库的GUI界面,主要是针对学生信息进行录入、查找和反馈问题,以及词云的生成。同时,每个界面均有多个选项,便于使用者选择,让GUI界面较为人性化,可操作性强。 关键词:GUI界面,学生信息查找、录入,词云 目 录 1实践选题及目标 1 2实践开发环境 4 3实践步骤 7 4关键代码 17 5实践结果与分析 31 6实践体会 ..

guboyi的博客 6543

Python-GUI界面设计(tkinter)

GUI界面设计(tkinter)

害怕也得前进 5万+

python怎么做gui界面,python gui界面设计

relief 指定边框样式,取值为FLAT(扁平,默认值) 、RAISED(凸起)、 SUNKEN(凹 陷)、RIDGE(脊状)、GROOVE(凹槽)和 SOLID(实线)使用grid()方法的布局被称为网格布局,它按照二维表格的形式,将容器划分为若干行和列,组件的位置由行列所在位置确定。● 容器中组件的布局是很繁琐的,需要调整组件自身的大小,还要设计和其他组件的相对位置。

Rtee1的博客 2470

python界面-推荐8款常用的Python GUI图形界面开发框架

作为Python开发者,你迟早都会用到图形用户界面来开发应用。本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言。Python 的 UI 开发工具包 KivyKivy是一个开源工具包能够让使用相同源代码创建的程序能跨平台运行。它主要关注创新型用户界面开发,如:多点触摸应用程序。Kivy还提供一个多点触摸鼠标模拟器。当前支持的平台包括:Linux、...

q6q6q的专栏 3万+

python图形化界面设计gui,用python做图形用户界面

这篇文章主要介绍了python编写图形化界面的工具,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。原文链接:(八)Python 图形化界面设计 - 简书声明:本篇文章为转载自(八)Python 图形化界面设计 - 简书,在原作者的基础上添加目录导航,旨在帮助大家以更高效率进行学习和开发。

2401_84471631的博客 2490

Python的GUI图形界面工具大全

Python的GUI图形界面工具大全

python03011的博客 9340

PyQt5多个GUI界面设计

版权声明:本文为博主原创文章,转载 请注明出处:https://blog.youkuaiyun.com/sc2079/article/details/83153693 - 写在前面   本科毕业设计终于告一段落了。特写博客记录做毕业设计(路面裂纹识别)期间的踩过的坑和收获。希望对你有用。   本篇讲GUI界面的设计。设计目标:实现用户对路面裂纹快速检测与识别,有三个界面:主界面、裂纹快速识别界面、图像处理测...

sc2079的博客 3万+

DeepSeek绝了!3分钟生成PPT,专治“五彩斑斓的黑“!!(保姆教程)

DeepSeek绝了!3分钟生成PPT,专治"五彩斑斓的黑"!!(保姆教程)

yizhen91y的博客 4万+

用Python语言设计GUI界面

  我们大家都编写过程序,但是如果能够设计一个GUI界面,会使程序增添一个很大的亮点!今天就让我们来用目前十分流行的python语言写出一个最基本的GUI,为日后设计更加漂亮的GUI打下基础。 工具/原料 Python编译软件 PyQt设计软件 方法/步骤   1 首先,如果没有安装python和PyQt软件的请先直接搜索下载并安装。python是一个开源软件,...

zhongranxu的专栏 7384

机器学习(ML)在材料领域应用

机器学习作为一种兼顾开发效率以及开发成本的方法,已经逐渐应用于材料发现、结构分析、性质预测、反向设计等多个领域,并且在材料学研究中展现出惊人的潜力。传统的发现新材料的方法,如经验试错法和基于密度泛函理论(DFT)的方法,往往需要较长的研发周期,成本高、效率低,已经不能很好的适应如今需求量激增的材料学领域 ...

W5632DE的博客 3720

解决Calibre中license的错误

本次解决了Calibre在Cadence 617 virtuoso版本中运行不了的错误,在遇到问题的时候,我也跟你们一样,首先是上网查询为什么运行不了呢?明明我安装了之后里面有Calibre的,我当时也是这样的疑惑,一点Calibre运行LVS的时候,一片空白,然后就出现了license的错误,后来点点点,看看看,搜搜搜,最终解决了这个问题。虚拟机是VMware16版本,cadence617,Calibre是2015版本。旨在记录遇到的实际问题。

yytu231的博客 1万+

python界面设计-python图形界面(GUI)设计

不要问我为什么要用 python 来做这种事,我回到“高兴咋地”也不是不可以,总之好奇有没有好的解决方案。逛了一圈下来,总体上来说,python 图形界面有以下几个可行度比较高的解决方案。1. pyside为什么要把它写第一个呢?因为已经接触过 Qt,所以,总体来讲,感觉它更亲一点。没错,它就是 pyQt 的 LGPL 版本(Qt官方的介绍是,Python for Qt)。这个框架最早是由 Nok...

weixin_37988176的博客 5410

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南)

本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。

gin88的博客 585

python拖拽式gui设计框架

Tkinter是Python的标准GUI工具包,提供了创建图形用户界面的各种工具和组件。它基于Tk GUI工具包,是Python内置的库,因此无需安装额外的模块即可使用。Tkinter具有简单易学、功能强大的特点,在Python界中广泛应用。通过Tkinter、PyQT和Kivy等GUI设计框架,我们可以轻松实现拖拽式的用户界面设计。不同的框架有各自的特点和优势,开发者可以根据项目需求和个人偏好选择合适的工具来构建用户友好的界面。

牛肉胡辣汤 4030

深度拆解 ‘High-Frequency Trading’ (HFT) 系统:解析如何在 100 纳秒内完成从网卡到 C++ 策略的响应

在100纳秒内完成从网卡到C++策略的响应,这是一项对技术栈每一个层面都进行极限优化的系统工程。它要求我们深入理解计算机体系结构、操作系统、网络协议和C++语言的底层机制。从物理距离的极致缩短,到高性能网卡和内核旁路技术,再到C++代码中每一个字节、每一个CPU周期的精打细算,HFT系统展现了人类对计算速度的永恒追求。这项技术不仅仅应用于金融交易,其背后的低延迟理念和实现方法,如DPDK、无锁编程、硬件加速等,正在逐渐渗透到其他对延迟敏感的领域,例如电信网络、边缘计算和工业自动化。

weixin_41455464的博客 1040

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5215
上一篇: Python脚本运行日志案例1
下一篇: Python Excel 小技巧:通用筛选函数
偷心伊普西隆
博客等级 码龄7年 511粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值