这个程序用多线程,实现设备之间的聊天,支持win10通知,欢迎下载

依赖的第三方库

win10toast

代码

将以下代码写入任意.py文件

 1 print('Welcome to use Pie IM')
2 print('2020 By 人工智障')
3
4 import socket
5 import tkinter as tk
6 import os
7
8 print('==================================================')
9
10 def logIn():
11 ip=enterIp.get()
12 logInWin.destroy()
13 global myip
14 myip=ip
15 print(ip)
16 os.system("python ./chat.py %s"%(ip))
17 exit()
18
19 logInWin=tk.Tk()
20 logInWin.geometry('360x360')
21 logInWin.resizable(0,0)
22 logInWin.title('Pie IM')
23 title=tk.Label(logInWin,text='Pie IM',font=('zpix',30),width=15,height=3,bg='blue',fg='white')
24 title.pack()
25 enterIpTip=tk.Label(logInWin,text='请输入对方的IP地址',font=('幼圆',15))
26 enterIpTip.pack(pady=20)
27 global login_enterIp
28 enterIp=tk.Entry(logInWin,width=40)
29 enterIp.pack()
30 btn=tk.Button(logInWin,text='登录',bd=2,font=('幼圆',15),command=logIn)
31 btn.pack(pady=25)
32 logInWin.mainloop()

将以下代码写入chat.py

 1 import tkinter as tk
2 from tkinter import *
3 import tkinter.messagebox as msgbox
4 import time
5 import socket
6 import threading
7 import sys
8 from win10toast import ToastNotifier
9
10 udp_socket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
11 udp_socket.bind((sys.argv[1],8080))
12
13 ip=sys.argv[1]
14 port=8081
15
16 def sendMsg():#发送消息
17 print('doing:sendMsg()')
18 msg=str(msgEnter.get('1.0',END))
19 print(msg)
20 print(type(msg))
21 strMsg='我:'+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
22 print(strMsg)
23 msgList.insert(END,strMsg+'\n','greencolor')#插入年月日
24 msgList.insert(END,msg+'\n')#输入的内容,0.0表示文本开始
25 msgList.insert(END,'\n')
26 msgEnter.delete('1.0',END)#删除中间刚输入的内容
27 udp_socket.sendto(msg.encode('utf-8'),(ip, port))
28
29 def recvMsg():
30 while True:
31 print('doing:recvMsg()')
32 print('正在接收...')
33 recv_data=udp_socket.recvfrom(8080)
34 msg=recv_data[0].decode('utf-8')
35 strMsg='对方:' + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
36 print(strMsg)
37 msgList.insert(END,strMsg+'\n','greencolor')#插入年月日
38 msgList.insert(END,msg+'\n')#输入的内容,0.0表示文本开始
39 msgList.insert(END,'\n')
40 toaster = ToastNotifier()
41 toaster.show_toast(ip,msg)
42
43 win=tk.Tk()
44 win.geometry('480x560')
45 win.title('test title')
46 win.iconbitmap("./icons/icon-mini.ico")
47
48 msgList=tk.Text(win,font=('幼圆',13))
49 msgList.pack(fill=BOTH,expand=True)
50
51 sendBtn=tk.Button(win,text='发送',bd=2,font=('等线',15),height=2,command=sendMsg)
52 sendBtn.pack(fill=X,expand=True)
53
54 msgEnter=Text(win,width='1',font=('幼圆',13))
55 msgEnter.pack(fill=BOTH,expand=True,pady=0)
56
57 t1=threading.Thread(target=recvMsg,name='Pie IM消息接收服务')
58 t1.start()
59 win.mainloop()

一个简单的IM聊天程序Pie IM(以后会更新)的更多相关文章

  1. python实现一个简单的网络聊天程序

    一.Linux Socket 1.Linux Socke基本上就是BSD Socket(伯克利套接字) 伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信.B ...

  2. 以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序

    Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,应用程序通常通过"套接字"向网络发出 ...

  3. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  4. hello/hi的简单的网络聊天程序

    hello/hi的简单的网络聊天程序 0 Linux Socket API Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程 ...

  5. 一个简单的P2P传输程序

    写了一个简单的P2P传输程序,在P2P的圈子中传输文件,不过为了简便,这个程序没有真正的传输文件,只是简单的判断一下文件的位置在哪里.这个程序可以处理当有一个peer闪退的情况,在这种情况下,剩下的p ...

  6. IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序

    前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...

  7. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...

  8. 一个简单的MDI示范程序(Delphi)

    http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI ...

  9. 一个简单的DDraw应用程序2

    //------------------------------------------------------------------------- // 文件名 : 6_1.cpp// 创建者 : ...

随机推荐

  1. matplotlib的学习12-Subplot 多合一显示

    import matplotlib.pyplot as plt # matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. plt.figure() ...

  2. Java并发包之 CopyOnWriteArrayList

    大家在学习Java的过程中,或者工作中,始终都绕不开集合.在单线程环境下,ArrayList就可以满足要求.多线程时,我们可以使用CopyOnWriteArrayList来保证数据安全.下面我们一起来 ...

  3. 微服务之间如何共享DTO?

    1. 概述 近些年来,微服务变得越来越流行.微服务基本特征是模块化.独立.易于扩展的.它们之间需要协同工作并交换数据.为了实现这一点,我们创建了名为 DTO 的共享数据传输对象.在本文中,我们将介绍在 ...

  4. JVM 经典垃圾收集器

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者.Java 虚拟机规范中对垃圾收集器的实现做出规定,因此不同的厂 ...

  5. mybatis-plus 自定义SQL,XML形式,传参的几种方式

    mybatis-plus 自定义SQL,XML形式,传参的几种方式 前提说明 所涉及文件 传参类型说明 1.Java代码中使用QueryWrapper动态拼装SQL 2.简单类型参数(如String, ...

  6. flowable流程启动时监听器

    一.核心配置类 package com.magus.project.flow.config; import com.google.common.collect.Maps; import com.mag ...

  7. 理解Tomcat工作原理

    WEB服务器 只要Web上的Server都叫Web Server,但是大家分工不同,解决的问题也不同,所以根据Web Server提供的功能,每个Web Server的名字也会不一样. 按功能分类,W ...

  8. 【代码周边】MongoDB与Mysql对比以及插入稳定性分析(指定主键的影响)

    在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录.也就是说,一个表不能有多个主键,并且主键不能为空值. 无论是MongoDB还是MySQL,都存在着主键的定义. 对于M ...

  9. [LeetCode98]98. Validate Binary Search Tree判断二叉搜索树

    判断二叉搜索树的方法是: 中序遍历形成递增序列 //全局变量记录中序遍历产生的序列,因为要递归,所以要用全局变量 List<Integer> list = new ArrayList< ...

  10. js表单简单验证(手机号邮箱)

    1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncod ...