python界面开发-python 图形界面编程(GUI)

1. Tkinter

在开始GUI编程之前,需要先了解这几个概念:窗口和控件、事件驱动处理、布局管理器。

窗体控件: 窗体、标签、按钮、列表框、滚动条等。

事件驱动:按下按钮及释放、鼠标移动、按回车键等。

布局管理:Tk有3种布局管理器:Placer、Packer、Grid

1.1 窗体控件

tkinter提供各种控件,如按钮、标签和文本框等,在一个GUI应用程序中使用。这些控件有时也被称为部件。目前有19种tkinter的控件。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

1.1.1 生成根窗体

from tkinter import *

top = Tk()

top.mainloop()

20200325173205606.png

1.1.2 添加标签

from tkinter import *

top = Tk()

label = Label(top, text = "hello tkinter")

label.pack()

top.mainloop()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

1.1.3 添加按钮

from tkinter import *

top = Tk()

label = Label(top, text = "hello tkinter")

button = Button(top ,text="第一个按钮")

label.pack()

button.pack()

top.mainloop()

20200325173922595.png

1.1.4 Checkbutton控件

from tkinter import *

top = Tk()

check_music = IntVar()

check_video = IntVar()

label = Label(top, text = "hello tkinter")

button = Button(top ,text="第一个按钮")

check_m = Checkbutton(top,text="Music", variable = check_music, onvalue =1, offvalue =0)

check_v = Checkbutton(top,text="Video", variable = check_video, onvalue =1, offvalue =0)

label.pack()

button.pack()

check_m.pack()

check_v.pack()

top.mainloop()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

1.1.5 Text控件

from tkinter import *

top = Tk()

check_music = IntVar()

check_video = IntVar()

label = Label(top, text = "hello tkinter")

button = Button(top ,text="第一个按钮")

check_m = Checkbutton(top,text="Music", variable = check_music, onvalue =1, offvalue =0)

check_v = Checkbutton(top,text="Video", variable = check_video, onvalue =1, offvalue =0)

font = ("黑体", 10, "bold")

text = Text(top,height=5, width=30, font=font, bg="white", fg="black")

text.insert(INSERT,"Hello GUI,")

text.insert(END, "Bye!")

label.pack()

button.pack()

check_m.pack()

check_v.pack()

text.pack()

top.mainloop()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

1.1.6 Menu控件

from tkinter import *

win = Tk()

win.title("Python GUI")

def _quit():

win.quit()

win.destroy()

exit()

# 创建菜单栏功能

menuBar = Menu(win)

win.config(menu = menuBar)

font = ("黑体", 10, "bold")

fileMenu = Menu(menuBar, tearoff=0, font=font, bg="white", fg="black")

menuBar.add_cascade(label="File", menu=fileMenu)

fileMenu.add_command(labe="New File")

fileMenu.add_separator()

fileMenu.add_command(labe="Exit",command=_quit)

helpMenu = Menu(menuBar, tearoff=0, font=font, bg="white", fg="black")

menuBar.add_cascade(label="Help", menu=helpMenu)

helpMenu.add_command(labe="About")

check_music = IntVar()

check_video = IntVar()

label = Label(win, text = "hello tkinter")

button = Button(win ,text="第一个按钮")

check_m = Checkbutton(win,text="Music", variable = check_music, onvalue =1, offvalue =0)

check_v = Checkbutton(win,text="Video", variable = check_video, onvalue =1, offvalue =0)

text = Text(win,height=5, width=30, font=font, bg="white", fg="black")

text.insert(INSERT,"Hello GUI,")

text.insert(END, "Bye!")

label.pack()

button.pack()

check_m.pack()

check_v.pack()

text.pack()

win .mainloop()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

1.2 实际应用

制作TCP通信的Server 和 Client

# -*- coding: utf-8 -*-

"""

Created on Thu Mar 26 15:34:10 2020

@author: sinlearn

"""

import tkinter as tk

import tkinter.ttk as ttk

import socket

import threading

import time

class TCP_Server():

def __init__(self):

winserver = tk.Tk()

winserver.title("TCP Server")

winserver.geometry("500x500")

winserver.resizable(width=False, height=False)

font = ("宋体", 10)

self.rbtn = tk.Radiobutton(winserver, text="未连接", fg="red")

self.label_port = tk.Label(winserver, text=" 端口:", font=font)

self.label_send = tk.Label(winserver, text=" 发送区:", font=font)

self.label_recv = tk.Label(winserver, text=" 接收区:", font=font)

self.label_clist = tk.Label(winserver, text=" 客户端列表:", font=font)

self.spinbox_port = tk.Spinbox(winserver, from_=1024, to=10000)

self.btn_start = tk.Button(winserver, text="启动", bg="white", command=self.do_start)

self.btn_stop = tk.Button(winserver, text="停止", bg="white", command=self.do_stop)

self.btn_send = tk.Button(winserver, text="发送", bg="white", command=self.send_to_client)

self.en_send = tk.Entry(winserver, text="Test", bd=2)

self.text_recv = tk.Text(winserver, height=5, width=43, font=font, bg="white", fg="black")

self.client_list = ttk.Treeview(winserver, height=10, show="headings",

columns=('col1', 'col2', 'col3')) # show = "headings" 隐藏默认的col0列

self.client_list.column('col1', width=50, anchor='center')

self.client_list.column('col2', width=200, anchor='center')

self.client_list.column('col3', width=100, anchor='center')

self.client_list.heading('col1', text='序号')

self.client_list.heading('col2', text='IP地址')

self.client_list.heading('col3', text='端口号')

self.rbtn.place(x=10, y=10)

self.label_port.place(x=100, y=15)

self.label_send.place(x=100, y=50)

self.label_recv.place(x=100, y=140)

self.spinbox_port.place(x=150, y=15)

self.btn_start.place(x=400, y=10)

self.btn_stop.place(x=440, y=10)

self.btn_send.place(x=440, y=70)

self.en_send.place(x=120, y=70, width=300, height=60)

self.text_recv.place(x=120, y=160)

self.label_clist.place(x=100, y=240)

self.client_list.place(x=120, y=260)

for i in range(10):

self.client_list.insert("", i, values=(i, "192.168.2.3" + str(i), "9999")) # 插入数据

self.client_list.bind("", self.onDBClick)

winserver.mainloop()

def onDBClick(self, event):

item = self.client_list.selection()[0]

print("you clicked on ", self.client_list.item(item, "values"))

def do_start(self):

self.rbtn["fg"] = "green"

self.rbtn["text"] = "已连接"

def do_stop(self):

print("正在断开连接....")

self.rbtn["fg"] = "red"

self.rbtn["text"] = "未连接"

def send_to_client(self):

if self.rbtn["text"] == "已连接":

print("正在发送数据....")

else:

print("连接未建立,不能发送数据....")

def tcp_link(self, sock, addr):

print(f" {addr} 正在请求连接........")

sock.send("欢迎您连接到服务器........".encode('utf-8'))

while True:

data = sock.recv(1024)

time.sleep(1)

if data and data.decode('utf-8') != "exit":

print(data.decode('utf-8'))

self.text_recv["text"] = data.decode('utf-8')

sock.send("服务器正在接收数据,请稍等........".encode('utf-8'))

else:

break

class TCP_Client():

def __init__(self):

self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

winclient = tk.Tk()

winclient.title("TCP Client")

winclient.geometry("600x250")

winclient.resizable(width=False, height=False)

font = ("宋体", 10)

self.rbtn = tk.Radiobutton(winclient, text="未连接", fg="red")

self.label_ip = tk.Label(winclient, text=" IP地址:", font=font)

self.label_port = tk.Label(winclient, text=" 端口:", font=font)

self.label_send = tk.Label(winclient, text=" 发送区:", font=font)

self.label_recv = tk.Label(winclient, text=" 接收区:", font=font)

self.spinbox_port = tk.Spinbox(winclient, from_=1024, to=10000)

self.btn_start = tk.Button(winclient, text="连接", bg="white", command=self.do_connect)

self.btn_stop = tk.Button(winclient, text="断开", bg="white", command=self.do_stopconnect)

self.btn_send = tk.Button(winclient, text="发送", bg="white", command=self.send_to_server)

self.en_ip = tk.Entry(winclient, text="IP地址", bd=2)

self.en_send = tk.Entry(winclient, text="Test", bd=2)

self.text_recv = tk.Text(winclient, height=5, width=43, font=font, bg="white", fg="black")

self.label_ip.place(x=100, y=15)

self.label_port.place(x=360, y=15)

self.label_send.place(x=100, y=50)

self.label_recv.place(x=100, y=150)

self.rbtn.place(x=10, y=10)

self.btn_start.place(x=480, y=10)

self.btn_stop.place(x=520, y=10)

self.btn_send.place(x=480, y=70)

self.en_ip.place(x=160, y=15, width=200, height=20)

self.spinbox_port.place(x=410, y=15, width=50, height=20)

self.en_send.place(x=120, y=70, width=300, height=60)

self.text_recv.place(x=120, y=170)

winclient.mainloop()

def do_connect(self):

print("正在连接服务器....")

self.rbtn["fg"] = "green"

self.rbtn["text"] = "已连接"

def do_stopconnect(self):

self.rbtn["fg"] = "red"

self.rbtn["text"] = "未连接"

def send_to_server(self):

print("正在往服务器发送数据.....")

if __name__ == "__main__":

TCP_Server()

TCP_Client()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjQ5Mzg4,size_16,color_FFFFFF,t_70

只实现了逻辑,我想具体里面的通信,和socket通信差不多,不继续写下去了,真是尴尬。感觉tkinter用起来还是不是很方便。

2. PyQT

2.1 认识PyQT

pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。Qt库是最强大的GUI库之一。pyqt5的类别分为几个模块,包括以下:

QtCore: 包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。

QtGui: 包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。

qtwidgets: 包含创造经典桌面风格的用户界面提供了一套UI元素的类。

QtMultimedia: 包含的类来处理多媒体内容和API来访问相机和收音机的功能。

Qtbluetooth: 包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。

Qtpositioning: 包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi、或一个文本文件。

Enginio: 实现了客户端库访问Qt云服务托管的应用程序运行时。

Qtwebsockets: 包含实现WebSocket协议类。

QtWebKit: 包含一个基于Webkit2图书馆Web浏览器实现类。

Qtwebkitwidgets: 的类的基础webkit1一用于qtwidgets应用Web浏览器的实现。

QtXml: 包含与XML文件的类。这个模块为SAX和DOM API提供了实现。

QtSvg: 提供了显示SVG文件内容的类。可伸缩矢量图形(SVG)是一种描述二维图形和图形应用的语言。

QtSql: 提供操作数据库的类。

QtTest: 包含的功能,使pyqt5应用程序的单元测试

2.2 学习PyQT

如果需要学习该部分的内容可参考:PyQT中文教程:,此处不做过多展开,主要是这个交互式环境,运行这部分代码,实在,呵呵呵。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值