python:并发编程(二十三)

这篇具有很好参考价值的文章主要介绍了python:并发编程(二十三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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

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

下一篇文章地址如下:

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方法来启动应用程序的事件循环。

界面展示如下:

python:并发编程(二十三)

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()

python:并发编程(二十三)

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()

python:并发编程(二十三)

上述代码逻辑为:

调用 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提供了丰富的组件和布局选项,可以根据需要进行灵活的界面设计。文章来源地址https://www.toymoban.com/news/detail-500414.html

到了这里,关于python:并发编程(二十三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JUC并发编程学习(十三)ForkJoin

    什么是ForkJoin ForkJoin在JDK1.7,并发执行任务!大数据量时提高效率。 大数据:Map Reduce(把大任务拆分成小任务) ForkJoin特点:工作窃取 为什么可以取窃取其他线程的任务呢?因为这里面维护的都是 双端队列 (即队列的两端都可以取元素) ForkJoin操作 在java.util.concurrent下的接

    2024年02月05日
    浏览(61)
  • CENTO OS上的网络安全工具(二十三)VSCODE SPARK 容器式编程环境构建

           在vscode上使用maven构建spark的scala编程环境,很大程度上需要不断地从网络上下载各种依赖和插件,而且这一过程复杂而不可控。下面这段,是整个安装过程中/root目录下不断增加的内容。         另一方面,vscode的离线安装也需要匹配容器中code与外部code的版本。所以

    2024年02月13日
    浏览(75)
  • Python爬虫(二十三)_selenium案例:动态模拟页面点击

    本篇主要介绍使用selenium模拟点击下一页,更多内容请参考:Python学习指南 分享一份Python的学习资料,但由于篇幅有限,完整文档可以扫码免费领取!!! 1)Python所有方向的学习路线(新版) 总结的Python爬虫和数据分析等各个方向应该学习的技术栈。 比如说爬虫这一块,很

    2024年02月04日
    浏览(61)
  • 一个月学通Python(二十三):RESTful架构和DRF入门

    结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》

    2024年02月16日
    浏览(46)
  • 一个月学通Python(二十三):RESTful架构和DRF入门(Web开发)

    结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》

    2024年02月14日
    浏览(46)
  • 半路出家自学当程序员这一年的经历,大家一起共勉

    2022年3月7日,我来到了上海。那是一个寒冷的夜晚。虽然因为提前找到了工作,心里还是比较踏实的。当时是我的牛马兄弟来接的我,然后我们住在了一起。这才使得我当时月薪4,000的人能够在上海得以生存。 来到上海没多久就出现了疫情,当时真的挺惨的。基本上一直是被

    2023年04月18日
    浏览(56)
  • 如何把aac转化为mp3?大家和我一起往下学习

        如何把aac转化为mp3?aac是一种先进的音频编码格式,通过较小的文件大小提供出色的音质体验。然而,由于其相对较少的普及度,与MP3相比,兼容性稍显不足,有些播放器可能无法直接识别aac格式。在某种程度上,我们可以将aac格式称为一种小众格式。考虑到这一点,一

    2024年02月11日
    浏览(36)
  • Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

    章节目标 理解Akka并发编程框架简介 掌握Akka入门案例 掌握Akka定时任务代码实现 掌握两个进程间通信的案例 掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是使用scala开发的库,

    2024年04月11日
    浏览(45)
  • YOLOv5系列(二十八) 本文(2万字) | 可视化工具 | Comet | ClearML | Wandb | Visdom |

    点击进入专栏: 《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程

    2024年02月03日
    浏览(63)
  • (三十三)补充Python经典面试题(吸收高级编程特性)

    这个函数定义有一个默认参数b,它的默认值是一个空列表[]。这道面试题涉及到Python中 函数参数默认值的一些重要概念和陷阱 。 首先,当你调用这个函数时,如果不传递参数b的值,它将使用默认的空列表[]。例如: 但是,这里有一个陷阱。默认参数b(即空列表[])在函数定

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包