精华内容
下载资源
问答
  • Tkinter 介绍 Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用...Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。 (脚本所用

    Tkinter 介绍

    Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

    由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。

    所用组件

    Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。
    (脚本所用到的组件)
    Button: 按钮控件;在程序中显示按钮。
    Label: 标签控件;可以显示文本和位图

    涉及代码

    1.先创建一个空界面

    from tkinter import *
    root = Tk()
    # 界面题目
    root.title(f"小可爱")
    #界面大小
    root.geometry('400x300')
    
    root.mainloop()
    
    

    在这里插入图片描述

    2.给空界面加上配置好的 label 和 button

    from tkinter import *
    import random
    root = Tk()
    # 界面题目
    root.title(f"小可爱")
    #界面大小
    root.geometry('400x300')
    
    value_label = Label(root ,text='1111111111', font = '仿宋 19 normal')
    value_label.pack(pady = 15,fill = BOTH,expand = True)
    
    history_label = Label(root ,text = '获奖号码展示', font = '楷体 9 normal', wraplength = 400)
    history_label.pack(side = BOTTOM,pady = 15)
    
    do_button = Button(root, text = '开始', font = '仿宋 9 normal', width = 20,cursor = 'hand2')
    do_button.pack(side = BOTTOM, pady = 15)
    
    root.mainloop()
    

    在这里插入图片描述

    3.在button上绑定点击函数do_click

    from tkinter import *
    import random
    
    is_scroll = False
    
    def do_click():
    	# 按钮的开始与停止逻辑
    	global is_scroll
    	is_scroll = not is_scroll
    	button_text = "停止" if is_scroll else "开始"
    	do_button.config(text = button_text)
    	#调用抽奖函数
    	if is_scroll:
    		run_counter()
    
    
    def run_counter():
    	pass
    
    
    
    root = Tk()
    # 界面题目
    root.title(f"小可爱")
    #界面大小
    root.geometry('400x300')
    
    value_label = Label(root ,text='1111111111', font = '仿宋 19 normal')
    value_label.pack(pady = 15,fill = BOTH,expand = True)
    
    history_label = Label(root ,text = '获奖号码展示', font = '楷体 9 normal', wraplength = 400)
    history_label.pack(side = BOTTOM,pady = 15)
    
    do_button = Button(root, text = '开始', font = '仿宋 9 normal', width = 20,cursor = 'hand2',command = do_click)
    do_button.pack(side = BOTTOM, pady = 15)
    
    root.mainloop()
    

    4.将value_label和history_label的text变量改为可变变量

    from tkinter import *
    import random
    
    is_scroll = False
    
    def do_click():
    	# 按钮的开始与停止逻辑
    	global is_scroll
    	is_scroll = not is_scroll
    	button_text = "停止" if is_scroll else "开始"
    	do_button.config(text = button_text)
    	#调用抽奖函数
    	if is_scroll:
    		run_counter()
    
    
    def run_counter():
    	pass
    
    
    root = Tk()
    # 界面题目
    root.title(f"小可爱")
    #界面大小
    root.geometry('400x300')
    
    #可变变量
    value_var = StringVar()
    #设置一个初始值
    value_var.set('点击开始进入抽奖')
    history_var = StringVar()
    
    
    value_label = Label(root ,textvariable = value_var, font = '仿宋 19 normal')
    value_label.pack(pady = 15,fill = BOTH,expand = True)
    
    history_label = Label(root ,textvariable=history_var, font = '楷体 9 normal', wraplength = 400)
    history_label.pack(side = BOTTOM,pady = 15)
    
    do_button = Button(root, text = '开始', font = '仿宋 9 normal', width = 20,cursor = 'hand2',command = do_click)
    do_button.pack(side = BOTTOM, pady = 15)
    
    root.mainloop()
    

    在这里插入图片描述

    5.从本地文件phones.txt中获得手机号,然后写抽奖函数,即可实现功能(完整代码)
    在这里插入图片描述

    from tkinter import *
    import random
    
    is_scroll = False
    
    def do_click():
    	# 按钮的开始与停止逻辑
    	global is_scroll
    	is_scroll = not is_scroll
    	button_text = "停止" if is_scroll else "开始"
    	do_button.config(text = button_text)
    	#调用抽奖函数
    	if is_scroll:
    		run_counter()
    
    
    def run_counter():
    	def counter():
    		global phones,is_scroll
    		if is_scroll:
    			#label中的配置
    			value_label.config(foreground = 'black')
    			# 从phones列表中随机获取一个元素
    			value_var.set(random.choice(phones))
    			# 100毫秒刷新一次
    			root.after(100, counter)
    		else:
    			#label中的配置
    			value_label.config(foreground = 'red')
    			#中奖处理
    			#移除中奖号码
    			lucky_phone = value_var.get()
    			phones.remove(lucky_phone)
    			#写入中奖列表
    			#如果history_var有值,s就是中奖结果,否则s为空
    			s = '中奖结果:\n' if not history_var.get() else history_var.get()
    			# 将抽到的号码写到history_var变量中
    			history_var.set(s + ' ' + lucky_phone)
    
    			value_var.set(f'恭喜{lucky_phone}中奖')
    	counter()
    
    
    
    
    with open('phones.txt','r') as f:
    	phones = f.readlines()
    #左右去掉\n字符
    phones = [x.strip('\n') for x in phones]
    # print(phones)
    
    
    
    root = Tk()
    # 界面题目
    root.title(f"小可爱")
    #界面大小
    root.geometry('400x300')
    
    #可变变量
    value_var = StringVar()
    #设置一个初始值
    value_var.set('点击开始进入抽奖')
    history_var = StringVar()
    
    
    value_label = Label(root ,textvariable = value_var, font = '仿宋 19 normal')
    value_label.pack(pady = 15,fill = BOTH,expand = True)
    
    history_label = Label(root ,textvariable=history_var, font = '楷体 9 normal', wraplength = 400)
    history_label.pack(side = BOTTOM,pady = 15)
    
    do_button = Button(root, text = '开始', font = '仿宋 9 normal', width = 20,cursor = 'hand2',command = do_click)
    do_button.pack(side = BOTTOM, pady = 15)
    
    root.mainloop()
    

    学习Python最主要的还是要动手,去找一些自己感兴趣的脚本,代码去练习,练的越多,对于一些英语单词,特殊符号要比死记硬背要容易记得些。最后附上视频教程链接,b站一位很厉害的师傅。
    视频教程地址

    展开全文
  • 原因很简单,因为我是一个命令行控,Linux习惯了不习惯了鼠标,总觉得点着不如敲命令快,各位在看这篇文章就说明和本人有相同的爱好.这个用python写的翻译工具是通过google来实现的,由于google返回的数据不是很规范(或者...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作...实现效果 运行效果如下: 二、基本思路 导入用到的库 importrequests fromlxmlimportetree importr...

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    以下文章来源于快学Python ,作者叶庭云

    刚接触Python的新手、小白,可以复制下面的链接去免费观看Python的基础入门教学视频

    https://v.douyu.com/author/y6AZ4jn9jwKW

    Python开发,用GUI编写一个天气查询桌软件

     

    一、实现效果

    运行效果如下:

    Python开发,用GUI编写一个天气查询桌软件

     

    二、基本思路

    导入用到的库

    import requests
    from lxml import etree
    import re
    import tkinter as tk
    from PIL import Image, ImageTk
    from xpinyin import Pinyin

    1. 爬虫部分

    目标url:https://lishi.tianqi.com/

    该网站提供了全国34个省、市所属的2290个地区的历史天气预报查询,数据来源于城市当天的天气信息,可以查询到历史天气气温,历史风向,历史风力等历史天气状况。

    Python开发,用GUI编写一个天气查询桌软件

     

    Python开发,用GUI编写一个天气查询桌软件

     

    分析网页可以发现,某个地区、某个月的所有天气数据的url为:https://lishi.tianqi.com/ + 地区名字的拼音 + '/' + 年月.html。根据用户输入的地区和时间,进行字符串的处理,构造出url,用于request请求有该月所有天气信息的页面,获取响应后Xpath定位提取用户输入的要查询的日期的天气信息,查询结果显示在tkinter界面。

    爬虫代码如下:

    def spider():
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24',
            "referer": "https://lishi.tianqi.com/chengdu/index.html"
        }
        p = Pinyin()
        place = ''.join(p.get_pinyin(b1.get()).split('-'))           # 获取地区文本框的输入  变为拼音
        # 处理用户输入的时间
        # 规定三种格式都可以 2018/10/1  2018年10月1日  2018-10-1
        date = b2.get()   # 获取时间文本框的输入
        if '/' in date:
            tm_list = date.split('/')
        elif '-' in date:
            tm_list = date.split('-')
        else:
            tm_list = re.findall(r'\d+', date)
    
        if int(tm_list[1]) < 10:       # 1-9月  前面加 0
            tm_list[1] = f'0{tm_list[1]}'
        # 分析网页发现规律   构造url
        # 直接访问有该月所有天气信息的页面 提高查询效率
        url = f"https://lishi.tianqi.com/{place}/{''.join(tm_list[:2])}.html"
        resp = requests.get(url, headers=headers)
        html = etree.HTML(resp.text)
        # xpath定位提取该日天气信息
        info = html.xpath(f'//ul[@class="thrui"]/li[{int(tm_list[2])}]/div/text()')
        # 输出信息格式化一下
        info1 = ['日期:', '最高气温:', '最低气温:', '天气:', '风向:']
        datas = [i + j for i, j in zip(info1, info)]
        info = '\n'.join(datas)
        t.insert('insert', '        查询结果如下        \n\n')
        t.insert('insert', info)
        print(info)

    2. tkinter界面

    代码如下:

    def get_image(file_nam, width, height):
        im = Image.open(file_nam).resize((width, height))
        return ImageTk.PhotoImage(im)
    
    
    win = tk.Tk()
    # 设置窗口title和大小
    win.title('全国各地历史天气查询系统')
    win.geometry('500x500')
    
    # 画布  设置背景图片
    canvas = tk.Canvas(win, height=500, width=500)
    im_root = get_image('test.jpg', width=500, height=500)
    canvas.create_image(250, 250, image=im_root)
    canvas.pack()
    
    # 单行文本
    L1 = tk.Label(win, bg='yellow', text="地区:", font=("SimHei", 12))
    L2 = tk.Label(win, bg='yellow', text="时间:", font=("SimHei", 12))
    L1.place(x=85, y=100)
    L2.place(x=85, y=150)
    
    # 单行文本框  可采集键盘输入
    b1 = tk.Entry(win, font=("SimHei", 12), show=None, width=35)
    b2 = tk.Entry(win, font=("SimHei", 12), show=None, width=35)
    b1.place(x=140, y=100)
    b2.place(x=140, y=150)
    
    # 设置查询按钮  点击 调用爬虫函数实现查询
    a = tk.Button(win, bg='red', text="查询", width=25, height=2, command=spider)
    a.place(x=160, y=200)
    
    # 设置多行文本框  宽 高  文本框中字体  选中文字时文字的颜色
    t = tk.Text(win, width=30, height=8, font=("SimHei", 18), selectforeground='red')  # 显示多行文本
    t.place(x=70, y=280)
    
    # 进入消息循环
    win.mainloop()

    tkinter界面效果如下:

    Python开发,用GUI编写一个天气查询桌软件

     

    结语

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小编的支持。

    展开全文
  • python编写一个简单的弹球游戏 这是学习python时用来练习的一个项目,作为笔记。 最终是实现一个简单的弹球游戏,效果图如下: 源代码: #无限命版的弹球游戏python代码 from tkinter import * # 来源于python的...

    用python编写一个简单的弹球游戏

    这是学习python时用来练习的一个项目,作为笔记。
    最终是实现一个简单的弹球游戏,效果图如下:
    在这里插入图片描述

    源代码:

    #无限命版的弹球游戏python代码
    from tkinter import *  # 来源于python的标准库,GUI
    import random
    import time
    
    
    # 创建Ball类,对小球进行定义
    class Ball:
        def __init__(self, canvas, paddle, color):  # 初始化函数
            self.canvas = canvas  # 把对象变量canvas赋值给对象变量canvas
            self.paddle = paddle #把对象变量赋值给paddle
            self.id = canvas.create_oval(10, 10, 25, 25, fill=color)  # 函数creat_oval返回的是创建目标的ID
            self.canvas.move(self.id, 245, 100)  # 移动小球到画布中心
            starts = [-3, -2, -1, 1, 2, 3]  # 定义一个列表存初始速度
            random.shuffle(starts)  # 把列表里面的数随机排列
            self.x = starts[0]  # 取列表中的第一个数
            self.y = -3  # 把小球向上的速度变为3,初始的合速度变大
            self.canvas_height = self.canvas.winfo_height()  # 获取当前画布高度并赋值给对象变量canvas_height
            self.canvas_width = self.canvas.winfo_width()
            self.hit_bottom = False
    
        def hit_paddle(self, pos): #定义弹球击打操作,当两个图像有相交时返回true,否则false
            paddle_pos = self.canvas.coords(self.paddle.id)
            if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
                if paddle_pos[1] <= pos[3] <= paddle_pos[3]:
                    return True
            return False
    
    #在画布上按照定义的要求画出小球
        def draw(self):
            self.canvas.move(self.id, self.x, self.y)  # 使小球移动,画布上move函数的调用,传入的参数是x,y
            pos = self.canvas.coords(self.id)  # 创建变量并将画布函数coords赋值给pos,通过圆的ID返回一个列表,4个数分别是左上角和右下角的坐标
            if pos[1] <= 0:#列表pos中0和1的位置是圆的左上方的坐标,2和3的位置是右下方的坐标
                self.y = 4  # 更改数字可以实现小球的不同方向的变速
            if pos[3] >= self.canvas_height:
    #            self.hit_bottom = True #如果想实现小球到画布底端就gameover可以加上这行,同时注释掉下一行
                self.y = -4
            if self.hit_paddle(pos) == True:#实现球与球拍接触时反弹
                self.y = -4
            if pos[0] <= 0:
                self.x = 4
            if pos[2] >= self.canvas_width:
                self.x = -4
    
    
    # 创建球拍类
    class Paddle:
        def __init__(self, canvas, color):
            self.canvas = canvas #和球类类似,先传入画布对象变量
            self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
            self.canvas.move(self.id, 200, 300)#游戏开始时设置球拍在初始位置
            self.x = 0
            self.canvas_width = self.canvas.winfo_width()#设置球拍左右的移动范围
            self.canvas.bind_all('<KeyPress-Left>', self.turn_left)#把按键和球拍类左右键分别进行绑定
            self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
    
        def draw(self): #在画布上画出球拍
            self.canvas.move(self.id, self.x, 0)
            pos = self.canvas.coords(self.id)
            if pos[0] <= 0:#这两个if语句用来设置球拍边界
                self.x = 0
            elif pos[2] >= self.canvas_width:
                self.x = 0
    
    #定义左右键函数
        def turn_left(self, evt):
            self.x = -5#改变数值可以实现球拍灵活度的改变
    
        def turn_right(self, evt):
            self.x = 5
    
    
    # 创建游戏画布
    tk = Tk()  # 创建tk对象
    tk.title("变速版弹球游戏")  # 使用tk对象中的title函数给窗口加标题
    tk.resizable(0, 0)  # 使窗口大小在水平和垂直方向上都不可以改变
    tk.wm_attributes("-topmost", 1)  # 把包含我们画布的窗口放到所有其他窗口之前
    canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)  # bd=0是确保在画布之外没有边框
    canvas.pack()  # 让画布按照前一行给出的宽度和高度参数来调整其自身大小
    tk.update()  # 让tkinter为游戏中的动画做好初始化
    
    paddle = Paddle(canvas, 'blue')
    ball = Ball(canvas, paddle, 'red')  # 创建一个Ball类的对象
    
    while 1:  # 动画循环,让tkinter一直画图
        if ball.hit_bottom == False:#如果球没有被接到,gameover
            ball.draw()
            paddle.draw()
        tk.update_idletasks()
        tk.update()
        time.sleep(0.01)  # 循环一次,python自己休息的时间,可以理解为一直画图的时候,间隔时间
    
    
    展开全文
  • 一、课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端。 2.知识点 ...本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装: $ sudo apt-get in...

    一、课程介绍

    1.简介

    本次项目课是实现简单聊天室程序的服务器端和客户端。

    2.知识点

    服务器端涉及到asyncore、asynchat和socket这几个模块,客户端用到了telnetlib、wx、time和thread这几个模块。

    3.所需环境

    本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装:

    $ sudo apt-get install python-wxtools

    密码为shiyanlou

    4.项目效果截图

    登录窗口

    聊天窗口

    5.源代码下载

    git clone https://github.com/shiyanlou/pythonchat.git

    说明:如果你不理解上述代码的下载方式或者下载后在环境中找不到代码,可以点击查看这里

    二、项目实战(服务器端)

    1.服务器类

    首先需要一个聊天服务器,这里继承asyncore的dispatcher类来实现,代码如下

    class ChatServer(dispatcher):
        """
        聊天服务器
        """
    
        def __init__(self, port):
            dispatcher.__init__(self)
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
            self.set_reuse_addr()
            self.bind(('', port))
            self.listen(5)
            self.users = {}
            self.main_room = ChatRoom(self)
    
        def handle_accept(self):
            conn, addr = self.accept()
            ChatSession(self, conn)

    2.会话类

    有了服务器类还需要能维护每个用户的连接会话,这里继承asynchat的async_chat类来实现,代码如下:

    class ChatSession(async_chat):
        """
        负责和单用户通信
        """
    
        def __init__(self, server, sock):
            async_chat.__init__(self, sock)
            self.server = server
            self.set_terminator('\n')
            self.data = []
            self.name = None
            self.enter(LoginRoom(server))
    
        def enter(self, room):
            '从当前房间移除自身,然后添加到指定房间'
            try:
                cur = self.room
            except AttributeError:
                pass
            else:
                cur.remove(self)
            self.room = room
            room.add(self)
    
        def collect_incoming_data(self, data):
            '接受客户端的数据'
            self.data.append(data)
    
        def found_terminator(self):
            '当客户端的一条数据结束时的处理'
            line = ''.join(self.data)
            self.data = []
            try:
                self.room.handle(self, line)
            except EndSession:
                self.handle_close()
    
        def handle_close(self):
            async_chat.handle_close(self)
            self.enter(LogoutRoom(self.server))

    3.命令解释器

    现在就需要一个命令解释器能够解释用户的命令,例如登录、查询在线用户和发消息等,代码如下:

    class CommandHandler:
        """
        命令处理类
        """
    
        def unknown(self, session, cmd):
            '响应未知命令'
            session.push('Unknown command: %s\n' % cmd)
    
        def handle(self, session, line):
            '命令处理'
            if not line.strip():
                return
            parts = line.split(' ', 1)
            cmd = parts[0]
            try:
                line = parts[1].strip()
            except IndexError:
                line = ''
            meth = getattr(self, 'do_' + cmd, None)
            try:
                meth(session, line)
            except TypeError:
                self.unknown(session, cmd)

    4.房间

    接下来就需要实现聊天室的房间了,这里我们定义了三种房间,分别是用户刚登录时的房间、聊天的房间和退出登录的房间,这三种房间都有一个公共的父类,代码如下:

    class Room(CommandHandler):
        """
        包含多个用户的环境,负责基本的命令处理和广播
        """
    
        def __init__(self, server):
            self.server = server
            self.sessions = []
    
        def add(self, session):
            '一个用户进入房间'
            self.sessions.append(session)
    
        def remove(self, session):
            '一个用户离开房间'
            self.sessions.remove(session)
    
        def broadcast(self, line):
            '向所有的用户发送指定消息'
            for session in self.sessions:
                session.push(line)
    
        def do_logout(self, session, line):
            '退出房间'
            raise EndSession
    
    class LoginRoom(Room):
        """
        刚登录的用户的房间
        """
    
        def add(self, session):
            '用户连接成功的回应'
            Room.add(self, session)
            session.push('Connect Success')
    
        def do_login(self, session, line):
            '登录命令处理'
            name = line.strip()
            if not name:
                session.push('UserName Empty')
            elif name in self.server.users:
                session.push('UserName Exist')
            else:
                session.name = name
                session.enter(self.server.main_room)
    
    class ChatRoom(Room):
        """
        聊天用的房间
        """
    
        def add(self, session):
            '广播新用户进入'
            session.push('Login Success')
            self.broadcast(session.name + ' has entered the room.\n')
            self.server.users[session.name] = session
            Room.add(self, session)
    
        def remove(self, session):
            '广播用户离开'
            Room.remove(self, session)
            self.broadcast(session.name + ' has left the room.\n')
    
        def do_say(self, session, line):
            '客户端发送消息'
            self.broadcast(session.name + ': ' + line + '\n')
    
        def do_look(self, session, line):
            '查看在线用户'
            session.push('Online Users:\n')
            for other in self.sessions:
                session.push(other.name + '\n')
    
    class LogoutRoom(Room):
        """
        用户退出时的房间
        """
    
        def add(self, session):
            '从服务器中移除'
            try:
                del self.server.users[session.name]
            except KeyError:
                pass

    5.服务器端完整代码

    #!/usr/bin/python
    # encoding: utf-8
    
    from asyncore import dispatcher
    from asynchat import async_chat
    import socket, asyncore
    
    PORT = 6666 #端口
    
    class EndSession(Exception):
        """
        自定义会话结束时的异常
        """
        pass
    
    class CommandHandler:
        """
        命令处理类
        """
    
        def unknown(self, session, cmd):
            '响应未知命令'
            session.push('Unknown command: %s\n' % cmd)
    
        def handle(self, session, line):
            '命令处理'
            if not line.strip():
                return
            parts = line.split(' ', 1)
            cmd = parts[0]
            try:
                line = parts[1].strip()
            except IndexError:
                line = ''
            meth = getattr(self, 'do_' + cmd, None)
            try:
                meth(session, line)
            except TypeError:
                self.unknown(session, cmd)
    
    class Room(CommandHandler):
        """
        包含多个用户的环境,负责基本的命令处理和广播
        """
    
        def __init__(self, server):
            self.server = server
            self.sessions = []
    
        def add(self, session):
            '一个用户进入房间'
            self.sessions.append(session)
    
        def remove(self, session):
            '一个用户离开房间'
            self.sessions.remove(session)
    
        def broadcast(self, line):
            '向所有的用户发送指定消息'
            for session in self.sessions:
                session.push(line)
    
        def do_logout(self, session, line):
            '退出房间'
            raise EndSession
    
    class LoginRoom(Room):
        """
        刚登录的用户的房间
        """
    
        def add(self, session):
            '用户连接成功的回应'
            Room.add(self, session)
            session.push('Connect Success')
    
        def do_login(self, session, line):
            '登录命令处理'
            name = line.strip()
            if not name:
                session.push('UserName Empty')
            elif name in self.server.users:
                session.push('UserName Exist')
            else:
                session.name = name
                session.enter(self.server.main_room)
    
    class ChatRoom(Room):
        """
        聊天用的房间
        """
    
        def add(self, session):
            '广播新用户进入'
            session.push('Login Success')
            self.broadcast(session.name + ' has entered the room.\n')
            self.server.users[session.name] = session
            Room.add(self, session)
    
        def remove(self, session):
            '广播用户离开'
            Room.remove(self, session)
            self.broadcast(session.name + ' has left the room.\n')
    
        def do_say(self, session, line):
            '客户端发送消息'
            self.broadcast(session.name + ': ' + line + '\n')
    
        def do_look(self, session, line):
            '查看在线用户'
            session.push('Online Users:\n')
            for other in self.sessions:
                session.push(other.name + '\n')
    
    class LogoutRoom(Room):
        """
        用户退出时的房间
        """
    
        def add(self, session):
            '从服务器中移除'
            try:
                del self.server.users[session.name]
            except KeyError:
                pass
    
    class ChatSession(async_chat):
        """
        负责和单用户通信
        """
    
        def __init__(self, server, sock):
            async_chat.__init__(self, sock)
            self.server = server
            self.set_terminator('\n')
            self.data = []
            self.name = None
            self.enter(LoginRoom(server))
    
        def enter(self, room):
            '从当前房间移除自身,然后添加到指定房间'
            try:
                cur = self.room
            except AttributeError:
                pass
            else:
                cur.remove(self)
            self.room = room
            room.add(self)
    
        def collect_incoming_data(self, data):
            '接受客户端的数据'
            self.data.append(data)
    
        def found_terminator(self):
            '当客户端的一条数据结束时的处理'
            line = ''.join(self.data)
            self.data = []
            try:
                self.room.handle(self, line)
            except EndSession:
                self.handle_close()
    
        def handle_close(self):
            async_chat.handle_close(self)
            self.enter(LogoutRoom(self.server))
    
    class ChatServer(dispatcher):
        """
        聊天服务器
        """
    
        def __init__(self, port):
            dispatcher.__init__(self)
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
            self.set_reuse_addr()
            self.bind(('', port))
            self.listen(5)
            self.users = {}
            self.main_room = ChatRoom(self)
    
        def handle_accept(self):
            conn, addr = self.accept()
            ChatSession(self, conn)
    
    if __name__ == '__main__':
        s = ChatServer(PORT)
        try:
            asyncore.loop()
        except KeyboardInterrupt:
            print

    三、项目实战(客户端)

    完成了服务器端后,就需要实现客户端了,这里客户端连接服务器使用了telnetlib模块。

    1.登录窗口

    这里的图形界面包选择了wxPython,前面有安装说明,登录窗口通过继承wx.Frame类来实现,代码如下:

    class LoginFrame(wx.Frame):
        """
        登录窗口
        """
    
        def __init__(self, parent, id, title, size):
            '初始化,添加控件并绑定事件'
            wx.Frame.__init__(self, parent, id, title)
            self.SetSize(size)
            self.Center()
            self.serverAddressLabel = wx.StaticText(self, label = "Server Address", pos = (10, 50), size = (120, 25))
            self.userNameLabel = wx.StaticText(self, label = "UserName", pos = (40, 100), size = (120, 25))
            self.serverAddress = wx.TextCtrl(self, pos = (120, 47), size = (150, 25))
            self.userName = wx.TextCtrl(self, pos = (120, 97), size = (150, 25))
            self.loginButton = wx.Button(self, label = 'Login', pos = (80, 145), size = (130, 30))
            self.loginButton.Bind(wx.EVT_BUTTON, self.login)
            self.Show()
    
        def login(self, event):
            '登录处理'
            try:
                serverAddress = self.serverAddress.GetLineText(0).split(':')
                con.open(serverAddress[0], port = int(serverAddress[1]), timeout = 10)
                response = con.read_some()
                if response != 'Connect Success':
                    self.showDialog('Error', 'Connect Fail!', (95, 20))
                    return
                con.write('login ' + str(self.userName.GetLineText(0)) + '\n')
                response = con.read_some()
                if response == 'UserName Empty':
                    self.showDialog('Error', 'UserName Empty!', (135, 20))
                elif response == 'UserName Exist':
                    self.showDialog('Error', 'UserName Exist!', (135, 20))
                else:
                    self.Close()
                    ChatFrame(None, -2, title = 'ShiYanLou Chat Client', size = (500, 350))
            except Exception:
                self.showDialog('Error', 'Connect Fail!', (95, 20))
    
        def showDialog(self, title, content, size):
            '显示错误信息对话框'
            dialog = wx.Dialog(self, title = title, size = size)
            dialog.Center()
            wx.StaticText(dialog, label = content)
            dialog.ShowModal()

    2.聊天窗口

    聊天窗口中最主要的就是向服务器发消息并接受服务器的消息,这里通过子线程来接受,代码如下:

    class ChatFrame(wx.Frame):
        """
        聊天窗口
        """
    
        def __init__(self, parent, id, title, size):
            '初始化,添加控件并绑定事件'
            wx.Frame.__init__(self, parent, id, title)
            self.SetSize(size)
            self.Center()
            self.chatFrame = wx.TextCtrl(self, pos = (5, 5), size = (490, 310), style = wx.TE_MULTILINE | wx.TE_READONLY)
            self.message = wx.TextCtrl(self, pos = (5, 320), size = (300, 25))
            self.sendButton = wx.Button(self, label = "Send", pos = (310, 320), size = (58, 25))
            self.usersButton = wx.Button(self, label = "Users", pos = (373, 320), size = (58, 25))
            self.closeButton = wx.Button(self, label = "Close", pos = (436, 320), size = (58, 25))
            self.sendButton.Bind(wx.EVT_BUTTON, self.send)
            self.usersButton.Bind(wx.EVT_BUTTON, self.lookUsers)
            self.closeButton.Bind(wx.EVT_BUTTON, self.close)
            thread.start_new_thread(self.receive, ())
            self.Show()
    
        def send(self, event):
            '发送消息'
            message = str(self.message.GetLineText(0)).strip()
            if message != '':
                con.write('say ' + message + '\n')
                self.message.Clear()
    
        def lookUsers(self, event):
            '查看当前在线用户'
            con.write('look\n')
    
        def close(self, event):
            '关闭窗口'
            con.write('logout\n')
            con.close()
            self.Close()
    
        def receive(self):
            '接受服务器的消息'
            while True:
                sleep(0.6)
                result = con.read_very_eager()
                if result != '':
                    self.chatFrame.AppendText(result)

    3.客户端完整代码

    #!/usr/bin/python
    # encoding: utf-8
    
    import wx
    import telnetlib
    from time import sleep
    import thread
    
    class LoginFrame(wx.Frame):
        """
        登录窗口
        """
    
        def __init__(self, parent, id, title, size):
            '初始化,添加控件并绑定事件'
            wx.Frame.__init__(self, parent, id, title)
            self.SetSize(size)
            self.Center()
            self.serverAddressLabel = wx.StaticText(self, label = "Server Address", pos = (10, 50), size = (120, 25))
            self.userNameLabel = wx.StaticText(self, label = "UserName", pos = (40, 100), size = (120, 25))
            self.serverAddress = wx.TextCtrl(self, pos = (120, 47), size = (150, 25))
            self.userName = wx.TextCtrl(self, pos = (120, 97), size = (150, 25))
            self.loginButton = wx.Button(self, label = 'Login', pos = (80, 145), size = (130, 30))
            self.loginButton.Bind(wx.EVT_BUTTON, self.login)
            self.Show()
    
        def login(self, event):
            '登录处理'
            try:
                serverAddress = self.serverAddress.GetLineText(0).split(':')
                con.open(serverAddress[0], port = int(serverAddress[1]), timeout = 10)
                response = con.read_some()
                if response != 'Connect Success':
                    self.showDialog('Error', 'Connect Fail!', (95, 20))
                    return
                con.write('login ' + str(self.userName.GetLineText(0)) + '\n')
                response = con.read_some()
                if response == 'UserName Empty':
                    self.showDialog('Error', 'UserName Empty!', (135, 20))
                elif response == 'UserName Exist':
                    self.showDialog('Error', 'UserName Exist!', (135, 20))
                else:
                    self.Close()
                    ChatFrame(None, -2, title = 'ShiYanLou Chat Client', size = (500, 350))
            except Exception:
                self.showDialog('Error', 'Connect Fail!', (95, 20))
    
        def showDialog(self, title, content, size):
            '显示错误信息对话框'
            dialog = wx.Dialog(self, title = title, size = size)
            dialog.Center()
            wx.StaticText(dialog, label = content)
            dialog.ShowModal()
    
    class ChatFrame(wx.Frame):
        """
        聊天窗口
        """
    
        def __init__(self, parent, id, title, size):
            '初始化,添加控件并绑定事件'
            wx.Frame.__init__(self, parent, id, title)
            self.SetSize(size)
            self.Center()
            self.chatFrame = wx.TextCtrl(self, pos = (5, 5), size = (490, 310), style = wx.TE_MULTILINE | wx.TE_READONLY)
            self.message = wx.TextCtrl(self, pos = (5, 320), size = (300, 25))
            self.sendButton = wx.Button(self, label = "Send", pos = (310, 320), size = (58, 25))
            self.usersButton = wx.Button(self, label = "Users", pos = (373, 320), size = (58, 25))
            self.closeButton = wx.Button(self, label = "Close", pos = (436, 320), size = (58, 25))
            self.sendButton.Bind(wx.EVT_BUTTON, self.send)
            self.usersButton.Bind(wx.EVT_BUTTON, self.lookUsers)
            self.closeButton.Bind(wx.EVT_BUTTON, self.close)
            thread.start_new_thread(self.receive, ())
            self.Show()
    
        def send(self, event):
            '发送消息'
            message = str(self.message.GetLineText(0)).strip()
            if message != '':
                con.write('say ' + message + '\n')
                self.message.Clear()
    
        def lookUsers(self, event):
            '查看当前在线用户'
            con.write('look\n')
    
        def close(self, event):
            '关闭窗口'
            con.write('logout\n')
            con.close()
            self.Close()
    
        def receive(self):
            '接受服务器的消息'
            while True:
                sleep(0.6)
                result = con.read_very_eager()
                if result != '':
                    self.chatFrame.AppendText(result)
    
    '程序运行'
    if __name__ == '__main__':
        app = wx.App()
        con = telnetlib.Telnet()
        LoginFrame(None, -1, title = "Login", size = (280, 200))
        app.MainLoop()

    四、小结

    最后就可以运行程序进行聊天了,注意需要先启动服务器再启动客户端。这个项目中使用了asyncore的dispatcher来实现服务器,asynchat的asyn_chat来维护用户的连接会话,用wxPython来实现图形界面,用telnetlib来连接服务器,在子线程中接受服务器发来的消息,由此一个简单的聊天室程序就完成了。

    转载于:https://www.cnblogs.com/rrxc/p/4530626.html

    展开全文
  • 我使用PyQt5 设计了一个GUI,设计界面如上图,想要实现如下功能: 当我在右边的 Plain text Edit A 中粘贴 纯文本文字,在左边两个Text Edit中 输入我想查找的关键字,当我点击查找按钮时,程序可以实现如下功能:...
  • 前期准备 Python   功能需求 1.采集数据,支持断线后重新登录时的数据自动补全 2.按日期存放到数据库中 ...以下是GUI.py用到的所有模块,其中有两是另外的自建.py文件 from tkinter imp...
  • python编写计算器,供大家参考,具体内容如下 (1)计算器界面如下: (2)基本满足了计算器的所有需求,使用时不可键盘输入,只能鼠标点击左键才可执行。初始时显示0.0,每次输入的内容存于D:\num.txt(启动程序时...
  • 一、Tkinter的介绍和简单教程 Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 由于 Tkinter 是内置到 ...创建一个GUI程序 1、导入 Tkinter 模块 2、创建控件 3、指定这个
  • BP神经网络实现手写数字识别BP神经网络模型用tkinter编写用于手写输入的画板程序运行的效果截图 在B站看了一个机器学习基础的视频(链接)后,发现到资料里面有一个用BP神经网络对手写数字进行分类的模型。有一天...
  • 一个轻量级的跨平台图形用户界面(GUI)开发工具,是Python的自带的官方标准库,安装Python 之后直接导入就可以使用, 我们常见的python IDLE就是使用TKinter实现。 PyQt QT是一个C ++编写的跨平台的框架。这是一个...
  • Python GUI编程各种实现的对比

    千次阅读 2014-11-30 11:51:58
    Python语言的诞生之日起,就有许多优秀的GUI工具集整合到Python当中,这些优秀的GUI工具集,... GUI编程的各种实现,下面的许多内容都是来自维基百科(文章后面列出了参考),这里就当做是一个没有技术色彩的整合吧。
  • 分形是通过从初始随机点开始迭代创建点序列而创建的,在该点中,序列中的每个点都是前一个点与多边形的一个顶点之间的距离的给定分数; 在每次迭代中随机选择顶点。 安装 确保您已安装 , 如果还没有,请安装和 ...
  • Python Tkinter 实现评分系统(GUI

    千次阅读 2019-03-23 00:49:21
    Tkinter :是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter ...简单编写一个评分检测系统,实...
  • 一个简单的界面很容易,即使是什么都不了解的情况下,这个文本转载了最简单的界面编写,下个文本介绍了TK的简单但具体的应用   在python中创建一个窗口,然后显示出来。 [python] view plain co
  • Python GUI编程(Tkinter) Tkinter 编程 Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 由于 Tkinter 是内置到 python ...1、第一个图形界面 from tkinter import * root = Tk
  • 过程同时解决了很多未知的技术和微小bug,所以还是耗费我的段时间心血和劳动力。 基于崇尚互联网自由和分享的精神,源代码和软件都全部放出。但希望后来使用和学习者能注明出处,尊重原创!。 2018年,对于...
  • 一个轻量级的跨平台图形用户界面(GUI)开发工具,是Python的自带的官方标准库,安装Python 之后直接导入就可以使用, 我们常见的python IDLE就是使用TKinter实现。 它最大的特点就是上手简单, 做个简单的小工具...
  • Python 编写的 DCPU-16 实现。 支持 C 文件的基本编译(编译器归功于 )、基本文本渲染、基本图形和 1.0 版的所有操作码。 也有一个图形用户界面,它允许你观察寄存器,一次单步执行一个字的代码,并观察内存...
  • 其次,编写一个评估函数和一个发现有价值点的函数然后进行计算。 第三,我将使用传统的使用alpha-beta算法的方法来设计简单的AI。 最终,我将使用类似alphago的方式。 现在,我已经完成了步骤2。 怎么跑 有三个要...
  • 最近护网过程中,应客户爸爸的要求,需要给各应用系统的管理员写一个弱密码查询工具,以便他们审计从应用系统中导出的用户名密码(MD5值)是否有弱密码。 分析: 功能实现和上一篇MD5解密都是一样,无非就是拿弱密码表...
  • python实现ocr

    万次阅读 2018-10-28 15:54:07
    python实现ocr 前期准备 在这个阶段主要准备整个小程序的结构,既然要实现...由于想做一个小程序,所以要为程序做GUI,这里采用tkinter编制GUI界面。 界面编写 界面主要就准备一个窗体,里面有菜单,给出OCR功能。 ...
  • 这是第一次写博客,先贴一个最近撸的一个Python程序,纯属练手。自娱自乐。 这个程序实现了以下几个功能:垃圾文件的查找,垃圾文件的删除,指定大小文件的查找和指定关键字文件的查找。 这个程序主要是练习GUI的...
  • 在配置好SNMP后(配置方法参考:windows下...用到的语言是python,版本是python3.6.2,编写GUI主要用到tkinter,接下来主要实现的功能是: 1.编制控制台程序,接受用户输入的 OID 字符串,返回在Windows/Linux SNMP ...
  • python3 GUI开发 (2)

    千次阅读 2017-08-06 16:37:22
    在配置好python3+PyQt5 + eric6 的环境后,QT Designer 软件下载安装,就可以开始尝试python GUI 开发,初步... 在了解和熟悉整个流程之后就开始尝试自己给之前写的最大逆向匹配分词程序编写一个易操作的可视化界面
  • 如何用PySide2设计一个自己想要的UI界面,其中的按键和文本框按照我们的需求实现所需要的功能呢? 实现方法很多,大概罗列下其中的两种设计思路: 代码编写 和 动态加载UI(下一章节说) 代码编写 代码编写:就是...
  • pythonGUI项目打包成exe文件

    万次阅读 多人点赞 2018-09-24 02:10:48
    本次主要讲解如何打包,所以在此只是设计一个十分简单GUI界面本次主要讲解如何打包,所以在此只是设计一个十分简单GUI界面 代码如下 from tkinter import Label widget=Label(None,text="Thi...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

python编写一个gui实现

python 订阅