前言
本文将和大家一起探讨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创建一个简单的界面:文章来源:https://www.toymoban.com/news/detail-500414.html
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模板网!