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

界面展示如下:

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提供了丰富的组件和布局选项,可以根据需要进行灵活的界面设计。

猜你喜欢

转载自blog.csdn.net/weixin_43431593/article/details/131361036