python:并发编程(二十三)

news2025/2/21 22:16:45

前言

本文将和大家一起探讨python并发编程的实际项目:win图形界面应用(篇五,共八篇),系列文章将会从零开始构建项目,并逐渐完善项目,最终将项目打造成适用于高并发场景的应用。

本文为python并发编程的第二十三篇,上一篇文章地址如下:

python:并发编程(二十二)_Lion King的博客-CSDN博客

下一篇文章地址如下:

(暂无)
 

一、主界面设计

1·、设计主窗口

import tkinter as tk

class ProtocolTestApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("协议测试")
        self.geometry("400x300")

if __name__ == "__main__":
    app = ProtocolTestApp()
    app.mainloop()

在这个示例中,定义了一个名为ProtocolTestApp的类,继承自Tk类。在__init__方法中,使用super()函数调用父类的初始化方法,然后设置窗口的标题为"协议测试",并将窗口大小设置为400x300。最后,创建一个ProtocolTestApp的实例,并调用mainloop方法来启动应用程序的事件循环。

界面展示如下:

2、添加菜单

import tkinter as tk

class ProtocolTestApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("协议测试")
        self.geometry("400x300")

        self.create_menu()

    def create_menu(self):
        menu_bar = tk.Menu(self)

        # 创建客户端菜单和子菜单
        client_menu = tk.Menu(menu_bar, tearoff=0)
        client_menu.add_command(label="TCP Client")
        client_menu.add_command(label="UDP Client")
        menu_bar.add_cascade(label="客户端", menu=client_menu)

        # 创建服务端菜单和子菜单
        server_menu = tk.Menu(menu_bar, tearoff=0)
        server_menu.add_command(label="TCP Server")
        server_menu.add_command(label="UDP Server")
        menu_bar.add_cascade(label="服务端", menu=server_menu)

        # 将菜单栏配置到窗口
        self.config(menu=menu_bar)

if __name__ == "__main__":
    app = ProtocolTestApp()
    app.mainloop()

 在这个示例中,在主窗口类的create_menu方法中创建了一个菜单栏menu_bar。然后,分别创建了客户端菜单client_menu和服务端菜单server_menu,并为每个菜单添加了子菜单项。最后,使用add_cascade方法将客户端菜单和服务端菜单添加到菜单栏中,然后将菜单栏配置到主窗口。

3、打开菜单选项的tab页

import tkinter as tk
from tkinter import ttk

class ProtocolTestApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("协议测试")
        self.geometry("400x300")

        self.notebook = ttk.Notebook(self)
        self.notebook.pack(fill="both", expand=True)

        self.create_menu()

    def create_menu(self):
        menu_bar = tk.Menu(self)

        # 创建客户端菜单和子菜单
        client_menu = tk.Menu(menu_bar, tearoff=0)
        client_menu.add_command(label="TCP Client", command=self.create_tcp_client_tab)
        client_menu.add_command(label="UDP Client", command=self.create_udp_client_tab)
        menu_bar.add_cascade(label="客户端", menu=client_menu)

        # 创建服务端菜单和子菜单
        server_menu = tk.Menu(menu_bar, tearoff=0)
        server_menu.add_command(label="TCP Server", command=self.create_tcp_server_tab)
        server_menu.add_command(label="UDP Server", command=self.create_udp_server_tab)
        menu_bar.add_cascade(label="服务端", menu=server_menu)

        # 将菜单栏配置到窗口
        self.config(menu=menu_bar)

    def create_tcp_client_tab(self):
        # 创建TCP Client的tab页
        tcp_client_frame = ttk.Frame(self.notebook)
        tcp_client_frame.pack(fill="both", expand=True)
        self.notebook.add(tcp_client_frame, text="TCP Client")

    def create_udp_client_tab(self):
        # 创建UDP Client的tab页
        udp_client_frame = ttk.Frame(self.notebook)
        udp_client_frame.pack(fill="both", expand=True)
        self.notebook.add(udp_client_frame, text="UDP Client")

    def create_tcp_server_tab(self):
        # 创建TCP Server的tab页
        tcp_server_frame = ttk.Frame(self.notebook)
        tcp_server_frame.pack(fill="both", expand=True)
        self.notebook.add(tcp_server_frame, text="TCP Server")

    def create_udp_server_tab(self):
        # 创建UDP Server的tab页
        udp_server_frame = ttk.Frame(self.notebook)
        udp_server_frame.pack(fill="both", expand=True)
        self.notebook.add(udp_server_frame, text="UDP Server")

if __name__ == "__main__":
    app = ProtocolTestApp()
    app.mainloop()

4、增加关闭tab页面的按钮

import tkinter as tk
from tkinter import ttk

class ProtocolTestApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("协议测试")
        self.geometry("400x300")

        self.notebook = ttk.Notebook(self)
        self.notebook.pack(fill="both", expand=True)

        self.create_menu()

    def create_menu(self):
        menu_bar = tk.Menu(self)

        # 创建客户端菜单和子菜单
        client_menu = tk.Menu(menu_bar, tearoff=0)
        client_menu.add_command(label="TCP Client", command=self.create_tcp_client_tab)
        client_menu.add_command(label="UDP Client", command=self.create_udp_client_tab)
        menu_bar.add_cascade(label="客户端", menu=client_menu)

        # 创建服务端菜单和子菜单
        server_menu = tk.Menu(menu_bar, tearoff=0)
        server_menu.add_command(label="TCP Server", command=self.create_tcp_server_tab)
        server_menu.add_command(label="UDP Server", command=self.create_udp_server_tab)
        menu_bar.add_cascade(label="服务端", menu=server_menu)

        # 将菜单栏配置到窗口
        self.config(menu=menu_bar)

    def create_tcp_client_tab(self):
        # 创建TCP Client的tab页
        tcp_client_frame = ttk.Frame(self.notebook)
        tcp_client_frame.pack(fill="both", expand=True)
        self.notebook.add(tcp_client_frame, text="TCP Client")

        # 创建关闭按钮
        close_button = ttk.Button(tcp_client_frame, text="×", width=8, command=lambda: self.close_tab(tcp_client_frame))
        close_button.place(relx=1.0, rely=0.0, anchor="ne")

    def create_udp_client_tab(self):
        # 创建UDP Client的tab页
        udp_client_frame = ttk.Frame(self.notebook)
        udp_client_frame.pack(fill="both", expand=True)
        self.notebook.add(udp_client_frame, text="UDP Client")

        # 创建关闭按钮
        close_button = ttk.Button(udp_client_frame, text="×", width=8, command=lambda: self.close_tab(udp_client_frame))
        close_button.place(relx=1.0, rely=0.0, anchor="ne")

    def create_tcp_server_tab(self):
        # 创建TCP Server的tab页
        tcp_server_frame = ttk.Frame(self.notebook)
        tcp_server_frame.pack(fill="both", expand=True)
        self.notebook.add(tcp_server_frame, text="TCP Server")

        # 创建关闭按钮
        close_button = ttk.Button(tcp_server_frame, text="×", width=8, command=lambda: self.close_tab(tcp_server_frame))
        close_button.place(relx=1.0, rely=0.0, anchor="ne")

    def create_udp_server_tab(self):
        # 创建UDP Server的tab页
        udp_server_frame = ttk.Frame(self.notebook)
        udp_server_frame.pack(fill="both", expand=True)
        self.notebook.add(udp_server_frame, text="UDP Server")

        # 创建关闭按钮
        close_button = ttk.Button(udp_server_frame, text="×", width=8, command=lambda: self.close_tab(udp_server_frame))
        close_button.place(relx=1.0, rely=0.0, anchor="ne")

    def close_tab(self, frame):
        self.notebook.hide(frame)

if __name__ == "__main__":
    app = ProtocolTestApp()
    app.mainloop()

上述代码逻辑为:

调用 create_tcp_client_tab()create_udp_client_tab()create_tcp_server_tab()create_udp_server_tab() 方法时,会创建一个新的 ttk.Frame 对象,并将其添加到 self.notebook 中作为选项卡页面。同时,在每个选项卡的 frame 中创建了一个关闭按钮。

close_button = ttk.Button(frame, text="×", width=8, command=lambda: self.close_tab(frame))
close_button.place(relx=1.0, rely=0.0, anchor="ne")

上述代码创建了一个 ttk.Button 对象,其文本为 "×",宽度为 8。command 参数设置为 lambda: self.close_tab(frame),这意味着在单击按钮时将执行 self.close_tab(frame) 方法,其中 frame 是当前选项卡的 frame。

def close_tab(self, frame):
    self.notebook.hide(frame)

close_tab() 方法接收一个 frame 参数,用于标识要关闭的选项卡。在该方法中,使用 self.notebook.hide(frame) 将指定的选项卡隐藏起来,实现了关闭选项卡的功能。

最后,您可以将以上代码添加到您的应用程序中,并在 if __name__ == "__main__": 代码块中创建 ProtocolTestApp 对象并运行应用程序。

二、关于界面设计

1、设计步骤

在Tkinter中设计界面可以通过以下步骤进行:

(1)导入Tkinter模块:首先,需要导入Tkinter模块,一般使用import tkinter as tk语句导入。

(2)创建主窗口:使用Tk()类创建一个主窗口对象,例如root = tk.Tk()

(3)添加组件:在主窗口中添加各种界面组件,如标签(Label)、按钮(Button)、文本框(Entry)、文本框区域(Text)、下拉菜单(OptionMenu)等。可以使用相应的类来创建组件对象,并通过pack()grid()place()方法来放置组件在窗口中的位置。

(4)设计布局:根据界面的需要,使用布局管理器(pack布局、grid布局或place布局)将组件放置在窗口中的适当位置。

(5)添加事件处理:为组件绑定事件处理函数,使其能够响应用户的交互操作。可以使用command参数或bind方法来绑定事件和处理函数。

(6)运行主循环:通过调用root.mainloop()方法来运行Tkinter的主循环,使界面显示并等待用户的交互操作。

下面是一个简单的示例代码,演示了如何使用Tkinter创建一个简单的界面:

import tkinter as tk

def button_click():
    label.config(text="Hello, Tkinter!")

root = tk.Tk()

label = tk.Label(root, text="Welcome to Tkinter!")
label.pack()

button = tk.Button(root, text="Click Me", command=button_click)
button.pack()

root.mainloop()

这个示例创建了一个包含标签和按钮的窗口,点击按钮后,标签的文本会改变。你可以根据自己的需求进行界面的设计和布局,使用不同的组件和布局方式来创建各种类型的界面。Tkinter提供了丰富的组件和布局选项,可以根据需要进行灵活的界面设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/682410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序快速入门【二】

微信小程序快速入门【二】 文章目录 微信小程序快速入门【二】👨‍🏫内容1:背景👨‍⚖️内容2:项目结构👨‍💻内容3:项目配置文件app.json👨‍🚀内容4&#x…

SpringBoot使用入门和案例实现

目录 1. 在pom.xml中添加依赖2. 编辑resources/application.properties3. 编写springboot的主程序4. 编写Controller程序5. IDEA本地测试6. 打包上传到服务器运行 1. 在pom.xml中添加依赖 步骤如下: 添加springboot的parent依赖添加springboot的starter-web依赖。…

osip开源库在windows平台上编译

背景 之前写过一篇关于sip协议栈选型的文章,最终采用了osip 2.3.6版本,文章中说明了为什么采用osip协议栈,以及为什么采用2.3.6版本。现在Linux上的产品已经基本满足需求了,接下来我们打算开发一套客户端和服务端对接&#xff0c…

电子邮件机器人和聊天机器人如何使您的客户支持受益?

当我们谈论客户支持中的人工智能时,通常会想到基于Web的聊天机器人。然而,现代人工智能的进步使电子邮件机器人成为客户支持自动化的下一个风口,使组织能够满足人们对于快速便捷的全渠道体验的期望。 有些人认为,与Facebook Mess…

“兆易创新杯”第十八届中国研究生电子设计竞赛有感

今年的电赛给我的感觉是时间真的紧张,可能是因为去年有疫情原因影响所以能准备的时间到七月份,今年不到月底就要全部出成品。我们团队一直在自研一款增强现实眼镜,从硬件设计到软件实现全部由我和另外两个小伙伴一起完成,所以就把…

matlab实现声音录制与左右声道分离

基础知识 1.MATLAB识别的常用语音信号类型: WAV格式 TXT格式 2.读取wav格式语音用函数:wavread 常用格式: ywavread(‘语音文件名’) [y,fs]wavread (‘语音文件名’) 用于读取语音,采样值放在向量y中,fs表示采样频率。 3.读取wav格式语音用…

动态代理与Spring Aop

动态代理 JDK 动态代理 使用JAVA反射包中的类和接口实现动态代理的功能,JAVA.lang.reflect包;主要是三个类: InvocationHandler,Method,Proxy; CGLIB动态代理,第三方工具类库,创建代理对象,cglib的原理是继…

城市内涝监测需要什么设备

近年来,随着城市化进程的加快,城市内涝问题愈发突出。强降雨、缺乏排水设施和过度的人类活动等因素,导致城市内涝灾害频发。内涝不仅给居民生活和财产安全带来威胁,还对城市基础设施和经济发展造成严重影响。 为了应对城市内涝灾…

spring中事务失效的情况(常见的5种)

1.多线程调用 从上面的例子中,我们可以看到事务方法add中,调用了事务方法doOtherThing,但是事务方法doOtherThing是在另外一个线程中调用的。 这样会导致两个方法不在同一个线程中,获取到的数据库连接不一样,从而是两…

centos7宝塔项目配置步骤

0、 1、 2、前面两个空格去掉勾 3、window 配置虚拟机 对应的域名

Django高级扩展之celery使用

Celery是一个简单、灵活、可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列,同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置…

CVE-2022-25099

文章目录 CVE-2022-25099一、漏洞介绍二、渗透步骤1、打开网站2、登录后台3、文件上传4、查看flag值 CVE-2022-25099 一、漏洞介绍 WBCE CMS v1.5.2 RCE。 WBCE CMS v1.5.2 /language/install.php 文件存在漏洞,攻击者可精心构造文件上传造成RCE。 二、渗透步骤 1…

宝塔面板实用教程(1):10分钟部署在线客服系统

客服系统发布以来,一直有朋友询问如何在宝塔面板中安装部署,开始我一直认为参考 Linux 版的安装教程就可以了,一直没有专门写宝塔环境的教程。这段时间来咨询的朋友越来越多,经过了解,我才知道宝塔面板的普及率有多高&…

SSM流浪动物救助网站-计算机毕设 附源码82131

SSM流浪动物救助网站 摘 要 随着生活水平的持续提高和家庭规模的缩小,宠物已经成为越来越多都市人生活的一部分,随着宠物的增多,流浪的动物的日益增多,中国的流浪动物领养和救助也随之形成规模,同时展现巨大潜力。本次…

XML文件

xml文件 类似于html那种标签语言 但是用途却大不一样,xml一般用于小型数据传输(存储数据) xml文件作用 xml语法规则 一个简单的xml文件案例 xml解析 解析思想 所谓的xml解析 也就是从xml文件提取数据 解析思想:前端的文档对…

【C++实现】RPC框架的简单实现介绍

文章目录 介绍为什么使用protobufprotobuf的service rpc 框架发布方的上层使用逻辑框架的提供方逻辑Rpc调用方框架实现客户端上层框架使用重新梳理简单聊一下RpcController 引入缓冲区队列zookeeper总结 介绍 以下博客覆盖内容: 集群和分布式概念原理; …

安科瑞智能照明系统在绿色建筑中的应用与产品选型

【摘要】:智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】:智能建筑;智能照明;节能…

什么样的口译是好的?交传和同传的评估标准是什么?

众所周知,交传和同传是口译的两种高级形式,难度比较大,一般应用于国际会议、商务洽谈、重大新闻发布会等领域。那么,如何做好交传和同传翻译,什么样的口译是好的,交传和同传的评估标准是什么,北…

密码学obe软件思路

匿名通信与暗网研究综述 匿名通信系统是一种建立在Internet之上综合利用数据转发、内容加密、流量混淆等多种技术隐藏通信实体关系和内容的覆盖网络.由于匿名通信主体难以被追踪定位,匿名通信网络中各类匿名滥用问题层出不穷,而其中隐藏服务机制更是被用于构建充斥着各种非法…

Integer移位算法

常用移位算法 给定值最高位1的权重给定值最低位1的权重给定值高位连续零的个数给定值低位连续零个数 给定值最高位1的权重 也就是给定值左侧。返回给定值左侧最大的2的次幂 //获取i最高位1代表的2次幂,最高位1代表的权值public static int highestOneBit(int i) …