『壹』 基於wechaty的定時消息推送(可以哄女朋友)、智能聊天和私人助理
---
title: "基於wechaty的定時消息推送(可以哄女朋友)、智能聊天和私人助理"
author: jasonlovesharon
email: [email protected]
tags:
- nodejs
- wechaty
- wechaty-puppet-padplus
---
## 前言
- 自從2017年微信web端API限制以後,itchat等一大批bot歇菜了,一直都在找一款合適的替品
- 目前來看,大部分都是針對windows微信客戶端,基於HOOK的dll注入實現對微信的操控,有一定的封號風險,只能用固定的版本,部署在linux伺服器端比較困難,意味著只能一直開著電- -wechaty,支持IPAD,,MAC等多種協議,不用去調用WEB網頁API,並且可以布署在伺服器,滿足我所有需求。[項目地址](https://github.com/wechaty/wechaty)
- 看完官方文檔後([token官方介紹](https://github.com/juzibot/welcome/wiki/everything-about-wechaty)), 發現需要申請Token,並且python版本的Token是要付費的,但沒有學過typescript,有點想放棄,瀏覽了一下ding-dong-bot的Example,似乎可以看懂,那就邊學習邊摸索吧。(ps:後來偶然見發現了另一衡旦如篇可以使用將token轉變一下實現python版wechaty,但此時已經基本用TS寫完了,如果想用Python等其他語言可以參考[官方文檔](https://github.com/wechaty/wechaty/issues/1985)。)
## 具備功能
### 1. 關鍵詞觸發功能
1.1 關鍵詞"介紹一下自己"、 "自我介紹一下"、 "你是誰"觸發自我介紹
1.2 地名+天氣 觸發天氣查詢
### 2. 智能聊天功能
2.1群外直接聊天
2.2群內成員皆有聊天許可權「@bot」 聊天
2.3不會回復 @其他群成員 的消咐啟息
## 實現過程
Talk is cheap,show your code
### 1. 主程序
```typescript
import { Wechaty, Message, UrlLink,log,} from 'wechaty'
import { PuppetPadplus } from 'wechaty-puppet-padplus'
import { EventLogger, QRCodeTerminal } from 'wechaty-plugin-contrib'
import { WechatyWeixinOpenAI, } from 'wechaty-weixin-openai'
import { setSchele, } from './schele/index'
import { getDay, formatDate,} from './utils/index'
import { getOne, getTXweather, getSweetWord,} from './superagent/index'
// 創建微信每日說定時任務
async function initDay() {
console.log(`已經設定每日說任務`);
setSchele('遲渣0 40 0 * * *', async () => {
console.log('你的貼心小助理開始工作啦!')
let logMsg
let contact =
(await bot.Contact.find({ name: 'Jason' })) ||
(await bot.Contact.find({ alias: 'boss' })) // 獲取你要發送的聯系人
let one = await getOne() //獲取每日一句
let weather = await getTXweather() //獲取天氣信息
let today = await formatDate(new Date()) //獲取今天的日期
let memorialDay = getDay('2009/08/07') //獲取紀念日天數
let sweetWord = await getSweetWord()
let str = `${today}\n我們相愛的第${memorialDay}天\n\n元氣滿滿的一天開始啦,要開心噢^_^\n\n今日天氣\n${weather.weatherTips}\n${
weather.todayWeather
}\n每日一句:<br>${one}<br><br>每日土味情話:<br>${sweetWord}<br><br>————————最愛你的我`
try {
logMsg = str
await delay(2000)
await contact.say(str) // 發送消息
} catch (e) {
logMsg = e.message
}
console.log(logMsg)
})
}
const padplusToken = '你自己的TOKEN'
const puppet = new PuppetPadplus({
token: padplusToken,
})
const bot = new Wechaty({
name: 'jason-assistant',
puppet,
})
bot.use(EventLogger())
bot.use(QRCodeTerminal({ small: true }))
//在Wechaty裡面引用和配置插件
const openAIToken = '你自己的機器人TOKEN' //需要在微信對話開放平台申請,點擊機器人設置》綁定應用》在頁面最下方即可看到
const openAIEncodingAESKey = '你自己的EncodingAESKey' //微信對話開放平台申請,點擊機器人設置》綁定應用》在頁面最下方即可看到
const preAnswerHook = async (message: Message) => {
const isCommonMaterial = await processCommonMaterial(message)
if (isCommonMaterial) {
return false
}
}
/**
* 獲得boss聯系名片,當機器人找不到問題答案時,將BOSS的名片推送過去
*/
const getBoss = async () => {
const contact = bot.Contact.load('boss微信ID')
await contact.sync()
return contact
}
const noAnswerHook = async (message: Message) => {
const room = message.room()
const from = message.from()
if (!room) {
const boss = await getBoss()
await message.say('你的問題我不會回答,你可以聯系我的老闆')
await message.say(boss)
return;
}
const members = await room.memberAll()
const bossInRoom = members.find(m => m.id === 'boss微信id')
if (bossInRoom) {
await room.say`${bossInRoom},${from}問的問題我不知道,你幫我回答一下吧。`
} else {
const boss = await getBoss()
await room.say`${from},你的問題我不會回答,你可以聯系我的老闆`
await room.say(boss)
}
}
/**
* 用wechaty-weixin-openai可以實現快速接入微信對話平台
*/
bot.use(WechatyWeixinOpenAI({
token: openAIToken,
encodingAESKey: openAIEncodingAESKey,
noAnswerHook, //在機器人無法回答時,推送設定的回答
preAnswerHook, //判斷是否是關鍵字,如果是關鍵字,觸發關鍵字回答而不接入微信開放平台
}))
const processCommonMaterial = async (message: Message) => {
const room = message.room()
// const from = message.from()
const mentionSelf = await message.mentionSelf()
const text = message.text()
let intro = 'Jason,愛好廣泛,廣交天下豪傑,上得了九天摘月,下得了五洋捉鱉,俗話說的好,不會烘培的飛行員不是好戶外人,不會玩音樂的水族愛好者不是好廚師,不會畫畫的極限愛好者不是好程序員,這就是我的老闆Jason,吼吼吼~~'
if (room !== null && mentionSelf) {
if (/jason|你老闆|你上司/.test(text)) {
await room.say(intro)
await room.say(new UrlLink({
description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬卷書,行萬里路,學習AND吃,喝,玩,樂',
thumbnailUrl: '',
title: 'Jason',
url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=&chksm=80d5be#rd',
}))
return true
} else if (/戶外賤客/.test(text)) {
await room.say(new UrlLink({
description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬卷書,行萬里路,學習AND吃,喝,玩,樂',
thumbnailUrl: '',
title: 'Jason',
url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=&chksm=80d5be#rd',
}))
return true
}
}
return false
}
// 登錄
async function onLogin(user) {
console.log(`貼心小助理${user}登錄了`)
// 登陸後創建定時任務
await initDay()
}
bot.on('login', onLogin)
bot.start()
.then(() => log.info('StarterBot', 'Starter Bot Started.'))
.catch(e => log.error('StarterBot', e))
```
### 2.創建schele定時函數
```typescript
import { schele } from 'node-schele'
// date 參數
//其他規則見 https://www.npmjs.com/package/node-schele
// 規則參數講解 *代表通配符
//
// * * * * * *
// ┬ ┬ ┬ ┬ ┬ ┬
// │ │ │ │ │ |
// │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
// │ │ │ │ └───── month (1 - 12)
// │ │ │ └────────── day of month (1 - 31)
// │ │ └─────────────── hour (0 - 23)
// │ └──────────────────── minute (0 - 59)
// └───────────────────────── second (0 - 59, OPTIONAL)
// 每分鍾的第30秒觸發: '30 * * * * *'
//
// 每小時的1分30秒觸發 :'30 1 * * * *'
//
// 每天的凌晨1點1分30秒觸發 :'30 1 1 * * *'
//
// 每月的1日1點1分30秒觸發 :'30 1 1 1 * *'
//
// 每周1的1點1分30秒觸發 :'30 1 1 * * 1'
function setSchele(date,callback) {
schele.scheleJob(date, callback)
}
export function setSchele()
```
### 3.創建幾個功能函數,爬取ONE網站的每日一句,提取通過API獲取的消息
```typescript
import * as cheerio from 'cheerio'
import * as superagent from 'superagent'
const ONE = 'http://wufazhuce.com/' // ONE的web版網站
const TXHOST = 'http://api.tianapi.com/txapi/' // 天行host
function req(url,method, params, data, cookies) {
return new Promise(function (resolve,reject) {
superagent(method, url)
.query(params)
.send(data)
.set('Content-Type','application/x-www-form-urlencoded')
.end(function (err, response) {
if (err) {
reject(err)
}
resolve(response)
})
})
}
async function getOne() {
// 獲取每日一句
try {
let res = await req(ONE, 'GET')
let $ = cheerio.load(res.text)
let todayOneList = $('#carousel-one .carousel-inner .item')
let todayOne = $(todayOneList[0])
.find('.fp-one-cita')
.text()
.replace(/(^\s*)|(\s*$)/g, '')
return todayOne
} catch (err) {
console.log('錯誤', err)
return err
}
}
async function getTXweather() {
// 獲取天行天氣
let url = TXHOST + 'tianqi/'
try {
let res = await req(url, 'GET', {
key: '你自己的KEY',//需要自己去天行申請,地址https://www.tianapi.com/signup.html?source=474284281
city: 'Arlington'
})
let content = JSON.parse(res.text)
if (content.code === 200) {
let todayInfo = content.newslist[0]
let obj = {
weatherTips: todayInfo.tips,
todayWeather:`阿林頓今天${todayInfo.weather}\n溫度:${todayInfo.lowest}/${todayInfo.highest}
\n${todayInfo.wind}風: ${todayInfo.windspeed}\n紫外線指數:${todayInfo.uv_index}\n濕度
${todayInfo.humidity}`
};
console.log('獲取天行天氣成功', obj)
return obj
} else {
console.log('獲取介面失敗', content.code)
}
} catch (err) {
console.log('獲取介面失敗', err)
}
}
async function getSweetWord() {
// 獲取土味情話
let url = TXHOST + 'saylove/'
try {
let res = await req(url, 'GET', { key: '' })
let content = JSON.parse(res.text)
if (content.code === 200) {
let sweet = content.newslist[0].content
let str = sweet.replace('\r\n', '<br>')
return str
} else {
console.log('獲取介面失敗', content.msg)
}
} catch (err) {
console.log('獲取介面失敗', err)
}
}
export { getOne, getTXweather, getSweetWord, }
```
### 計算距離某日(生日,結婚紀念日等)還有多少天
```typescript
function getDay(date) {
var date2 = new Date()
var date1 = new Date(date)
var iDays = parseInt(
Math.abs(date2.getTime() - date1.getTime()) / 1000 / 60 / 60 / 24
)
return iDays
}
function formatDate(date) {
var tempDate = new Date(date)
var year = tempDate.getFullYear()
var month = tempDate.getMonth() + 1
var day = tempDate.getDate()
var hour = tempDate.getHours()
var min = tempDate.getMinutes()
var second = tempDate.getSeconds()
var week = tempDate.getDay()
var str = ''
if (week === 0) {
str = '星期日'
} else if (week === 1) {
str = '星期一'
} else if (week === 2) {
str = '星期二'
} else if (week === 3) {
str = '星期三'
} else if (week === 4) {
str = '星期四'
} else if (week === 5) {
str = '星期五'
} else if (week === 6) {
str = '星期六'
}
if (hour < 10) {
hour = '0' + hour
}
if (min < 10) {
min = '0' + min
}
if (second < 10) {
second = '0' + second
}
return year + '-' + month + '-' + day + '日 ' + hour + ':' + min + ' ' + str
}
export { getDay, formatDate }
```
![關鍵字觸發消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/keyword-push.png)
![無法回答推送名片](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/push-contact.png)
![定時推送消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/daily-message.png)
![智能聊天](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/talk-to-bot.png)
## 後記
到此已經實現了私人人助理和定時推送消息的功能([項目地址](https://github.com/jasonlovesharon/my_bot)),由於對Typescript不熟,很多功能都是借鑒很多大神的輪子實現的,還是對Python熟悉點,下步准備用Python來實現以上功能,並進一步拓展更多有趣的功能。
『貳』 python小程序可以多人同時操作嗎
可以。根據查詢python小程序相關資料得知,python小程序可以多人同時操作。Python使用django框架實現多人在線匿名聊天的小程序,Python是一種面向對象解釋型計算機程序設計語言,由GuidovanRossum於1989年底發明,第一個公開發行版發行於1991年Python語法簡潔而清晰,具有豐富和強大的類庫常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊很輕松地聯結在一起。
『叄』 利用Python語言,設計一個網路聊天程序oswa實現網路通信或者文件傳輸
你是要外網通信還是只在內網通信,如果外網需要先做埠映射或者租伺服器
『肆』 python-socketio 文檔翻譯
教程: https://tutorialedge.net/python/python-socket-io-tutorial/
python-socketio 原文地址 ,在google瀏覽器中可以翻譯為中文去使用。
首先要搞明白幾個問題:
說明
1)第一種room是每一個單獨的客戶端都有的。(通過 session ID 可以找到)
2)第二種是應用程序自己創建的。
在下面這個方法中,如果省略掉room參數,將會自動發送給所有的連接了的客戶端。
譯文:
Python-socketio實現了一個Python Socket.IO 服務,這個服務可以單獨運行也可以綜合於一個web項目中。下面是一些它的特徵:
什麼是Socket.IO?
Socket.IO是一個基於事件的雙向通訊的傳輸協議(一般是web瀏覽器),和一個服務端。原始的客戶端和服務端組件實現是通過JavaScript寫的。
入門指南
可以使用 pip 安裝Socket.IO:
下面是一個使用 aiohttp 框架(只支持Python 3.5+)實現非同步IO的 Socket.IO server 簡單的例子:
下面是一個類似的例子,但是使用的Flask和Eventlet的例子,兼容Python2.7和3.3+:
客戶端應用必須引入 socket.io-client 庫(1.3.5版本以及以上,越高越好)。
每次客戶端連接到伺服器的連接事件處理程序調用sid(會話ID)分配給連接和WSGI環境字典。
每次客戶端連接到服務端的 conenct 事件都是由sid(session ID)分配到連接和WSGI環境字典調用的。服務端可以檢查身份認證或者其他的頭部信息去決定是否這個客戶端允許被連接。要想拒絕一個客戶端的連接,這個處理器必須返回 False 。
當客戶端發送發送一個事件給服務端,相應的事件處理器會被 sid 和這個信息調用,可以是單個或者多個參數。這個應用可以定義盡量多的如果被需要的可以被事件處理器關聯的事件。一個事件可以通過一個名稱簡單定義。
當一個客戶端連接中斷了, disconnect 事件就被調用,允許應用去執行清理工作。
服務端
Socket.IO 服務端是 socketio.Server 類的實例,他們可以被一個WSGI適用應用程序使用 socketio.Middleware 去合並:
使用 socketio.Server.on() 方法來注冊服務端的事件處理器:
對於非同步服務端來說,事件處理器可以是常規方法,或者是協程:
聊天室
因為Socket.IO是一個雙向的協議,服務端可以在任意時間發送消息給任意的連接到的客戶端。為了讓它方便去將客戶端定位到組中,應用程序可以將客戶端放入到聊天室中去,然後將消息定位到整個聊天室中。
當客戶端第一次連接,他們是被分配到他們自己的聊天室中,這個聊天是是以session ID(sid 參數會傳遞給所有的事件處理器)命名的。應用可以通過 socketio.Server.enter_room() 和 socketio.Server.leave_room() 自由地去創建聊天室和管理客戶端。客戶端可以在盡量多的房間里,也可以根據需求盡量頻繁地被拉入拉出聊天室。當他們的連接不在特別的時候,單獨的聊天室將會分配給她它們,應用程序可以自由地增加和移除客戶端從聊天室中,盡管它只要這樣做就會失去定位獨立客戶端的能力。
socketio.Server.emit() 方法會獲得一個事件名稱,一個可能是 str , bytes , list , dict 或者 tuple 類型的消息載體。當發送一個 tuple ,在其中的元素必須是上面的其他類型。元組中的元素將會被傳遞給客戶端的回調函數為多個參數。定位一個個人客戶端,客戶端的 sid 將會被給一個聊天室(假設這個應用沒有修改這些初始的聊天室)。定位所有的連接的客戶端們,這個聊天室參數將會被觸發。
通常在聊天室中當廣播一個消息到一個用戶組的時候,發送者是否接受他自己的消息是可選的。 soicketio.Server.emit() 方法提供了一個可選的 skip_sid 參數去指定一個想在廣播中跳過的客戶端。
Response
當一個客戶端發送一個事件給服務端,它可以選擇提供一個回調方法,當服務端返回一個響應的時候會被觸發。服務端可以便捷地從相應的事件處理器返回它從而提供一個響應。
事件處理器可以返回一個單獨的值,一個帶多個值的元組。這個在客戶端的回調函數將會調用這些返回的值。
Callbacks
回調
服務端可以請求一個響應通過發送一個事件給客戶端。 socketio.Server.emit() 方法有一個可選的 callback 參數能夠被設置為可回調的。當這個參數被傳遞之後,當客戶端返回相應的時候,這個可回調的方法將會被請求。
當廣播給多個客戶端的時候使用回調函數是不被推薦的,因為回調方法將會被只執行一次。
Namespace
命名空間
Socket.IO 協議支持多個邏輯性連接,所有的多路復用都是在相同的物理連接上。客戶端可以通過給每個連接指定不同的 namespace 從而開多個連接。一個命名空間是由 主機名+埠+路徑名稱構成的。比如,連接到 http://example.com:8000/chat 將會開一個連接到命名空間 /chat 。
由於分離的不同的session ID( sid s),不同的事件處理器,不同的聊天室,每一個命名空間都是獨立的。應用程序使用多個命名空間從而來區分命名空間,是非常重要的。可以參考 socketio.Server 類。
當 namespace 參數被觸發了,比如設置為 None 或者 / , 那麼一個默認的命名空間將會被使用。
Class-Based Namespaces
作為一個基於裝飾器的事件處理器的代替,這個屬於一個命名空間事件處理器可以被創建為 socketio.Namesapce 的子類:
對於基於非同步io的服務端,域名空間必須繼承與 socketio.AsyncNamespace , 也可以定義普通的方法或者協程作為事件處理器:
當使用基於類的命名空間的時候,任何被服務端接受的事件將會被分派到一個被事件名稱命名的方法中作為方法名稱(with the on_pfrefix )。比如:事件 my_event 將會被一個名叫 on_my_event 的方法處理。
『伍』 python寫的socket自動聊天:從mysql返回到程序中的數據是nonetype類型,怎麼解決
我覺得你應把MYSQL的返回內容列印出來看看,我猜是沒有在MYSQL中查到內容,返回了空值造成的。
『陸』 人機界面屬於哪個庫
Python庫之圖形用戶界面
Python庫之游戲開發
Python庫之虛擬現實
Python庫之圖形藝術
二、Python庫之圖形用戶界面
2.1 PyQt5
提供了創建Qt5程序的Python API介面
Qt是非常成熟的跨平台桌面應用開發系統,完備GUI
推薦的Python GUI開發第三方庫
2.2 wxPython
提供了專用於Python的跨平台GUI開發框架
理解數據類型與索引的關系,操作索引即操作數據
Python最主要的數據分析功能庫,基於Numpy開發
import wx
app = wx.App(False)
frame = wx.Frame(None, wx.ID_ANY, "Hello World") frame.Show(True)
app.MainLoop()
2.3 PyGObject
提供了整合GTK+、WebKitGTK+等庫的功能
GTK+:跨平台的一種用戶圖形界面GUI框架
實例:Anaconda採用該庫構建GUI
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
window = Gtk.Window(title="Hello World")
window.show()
window.connect("destroy", Gtk.main_quit)
Gtk.main()
三、Python庫之游戲開發
3.1 PyGame
提供了基於SDL的簡單游戲開發功能及實現引擎
理解游戲對外部輸入的響應機制及角色構建和交互機制
Python游戲入門最主要的第三方庫
3.2 Panda3D
Panda3D: 開源、跨平台的3D渲染和游戲開發庫,http://www.panda3d.org
一個3D游戲引擎,提供Python和C++兩種介面
支持很多先進特性:法線貼圖、光澤貼圖、卡通渲染等
由迪士尼和卡尼基梅隆大學共同開發
3.3 cocos2d
ocos2d: 構建2D游戲和圖形界面互動式應用的框架,http://python.cocos2d.org/
提供了基於OpenGL的游戲開發圖形渲染功能
支持GPU加速,採用樹形結構分層管理游戲對象類型
適用於2D專業級游戲開發
四、Python庫之虛擬現實
4.1 VR Zero
提供大量與VR開發相關的功能
針對樹莓派的VR開發庫,支持設備小型化,配置簡單化
非常適合初學者實踐VR開發及應用
4.2 pyovr
針對Oculus VR設備的Python開發庫
基於成熟的VR設備,提供全套文檔,工業級應用設備
Python+虛擬現實領域探索的一種思路
4.3 Vizard
專業的企業級虛擬現實開發引擎
提供詳細的官方文檔
支持多種主流的VR硬體設備,具有一定通用性
五、Python庫之圖形藝術
5.1 Quads
對圖片進行四分迭代,形成像素風
可以生成動圖或靜圖圖像
簡單易用,具有很高展示度
5.2 ascii_art
將普通圖片轉為ASCII藝術風格
輸出可以是純文本或彩色文本
可採用圖片格式輸出
5.3 turtle
六、單元小結
6.1 從人機交互到藝術設計
PyQt5、wxPython、PyGObject
PyGame、Panda3D、cocos2d
VR Zero、pyovr、Vizard
Quads、ascii_art、turtle
相關資源:covid19:通過使用Python和Plotly構建的互動式圖表探索加拿大的CO...
文章知識點與官方知識檔案匹配
Python入門技能樹首頁概覽
215912 人正在系統學習中
點擊閱讀全文
打開CSDN APP,看更多技術內容
python人機交互設計_063 Python必備庫-從人機交互到藝術設計
Vizard: 基於Python的通用VR開發引擎,http://www.worldviz.com/vizard-virtual-reality-software 專業的企業級虛擬現實開發引擎 提供詳細的官方文檔 支持多種主流的VR硬體設備,具有一定通用性 五、Python庫之圖形藝術 5.1 Quads Quads: 迭...
繼續訪問
製作互動式數據可視化圖表,只需要一個Python庫就能實現!_翎子生。的...
Python第三方庫中我們最常用的可視化庫是 pandas,matplotlib,pyecharts, 當然還有 Tableau,另外最近在學習過程中發現另一款可視化神器-Plotly,它是一款用來做數據分析和可視化的在線平台,功能非常強大, 可以在線繪制很多圖形比如條形圖、散點...
繼續訪問
人機界面
Keras實施3D-VAE 配套 python 3.6 tensorflow-gpu 1.13.1 matplotlib 3.3.2 scikit-image 0.17.2 數據集 出於空間考慮,我們使用數據集,在此存儲庫中,我們僅在椅子類(03001627)的.binvox文件中提供體積數據,用於訓練和測試VAE,該文件位於./dataset下。 如果您想使用許多其他不同類型的對象進行訓練,則可以在上面的網站上找到完整的數據集,它需要一個帳戶來下載它們。 此外,斯坦福大學還在以下提供相同的數據集: : ,方便下載。 體積數據在ShapeNetVox32.tgz下,圖像數據在ShapeNetRendering.tgz下。 體積數據 椅子類中有6778個元素,完整的對象位於/dataset/03001627 。 我們還將其分為訓練集和測試集, /dataset/03001627_t
python人機交互界面設計_Python-Tkinter圖形化界面設計(詳細教程 )
聲明:本篇文章為轉載自https://www.jianshu.com/p/91844c5bca78,在原作者的基礎上添加目錄導航,旨在幫助大家以更高效率進行學習和開發。Python-Tkinter 圖形化界面設計(詳細教程)本文目錄一.圖形化界面設計的基本理解當前流行的計算機桌面應用程序大多數為圖形化用戶界面(Graphic User Interface,GUI),即通過滑鼠對菜單、按鈕等圖形化元...
繼續訪問
python編寫交互界面設計_使用python製作ArcGIS插件(4)界面交互
這是在插件執行交互性操作的時候所需要用到的。由於原始的python是沒有界面的,所以,這些元素就全靠pythonaddins封裝了。 其他的界面類,如按鈕類、組合框等,這些都是固定的設計。還有一部分是工具類型,如操作時的滑鼠指針,各種的滑鼠和...
繼續訪問
9.4 Python 從人機交互到藝術設計(圖形用戶界面/游戲開發/虛擬現實/圖形...
本文內容為北京理工大學Python慕課課程的課程講義, 將其整理為OneNote筆記同時添加了本人上課時的課堂筆記, 且主頁中的思維導圖就是根據課件內容整理而來, 為了方便大家和自己查看,特將此上傳到CSDN博文中, 源文件已經上傳到我的資源中,...
繼續訪問
python人機交互界面
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄1.加入背景圖片顯示界面代碼2.設置背景顏色代碼 提示:以下是本篇文章正文內容,下面案例可供參考 1.加入背景圖片顯示界面代碼 代碼如下(示例): import tkinter as tk root = tk.Tk() root.title('0-1背包實例數據集演算法平台') root.geometry('600x340') # 增加背景圖片 photo = tk.PhotoImage(file="D:\study\python.
繼續訪問
Pygame介紹以及下載
一、介紹 Pygame是一個利用SDL庫實現的模塊。SDL全稱Simple DirectMedia Layer,是一套開放源代碼的跨平台多媒體開發庫,使用C語言寫成。SDL提供了數種控制圖像、聲音、輸出入的函數,讓開發者只要相同或者相似的代碼就能開發出多個平台,比如Linux、Windows、Mac OSX等的應用程序。 二、下載 Pygame官網:https://www.pygame.or...
繼續訪問
Dragonboard 410c Python 交互設計——PyQt環境搭建_ANDYMFC_No1的博客...
Python是一個非常容易上手和使用的語言,非常適合開發者快速的搭建和實現自己ideal原型,在開發中,可以通過Python快速的搭建自己的想法,並且後續很容易使用其他更高性能的語言進行局部或者全局的優化。UI交互設計是開發中常見的一個問題,今天...
繼續訪問
python如何實現界面交互設計_python圖形化界面設計(wxpython)三全面介紹...
窗口和對話框的交互 高級控制項 表格控制項 高級列表控制項 樹形控制項 樹表控制項 定時器控制項 WxPython庫中的高級功能 主要使用wxPython(最成熟的跨平台python GUI工具包) 前戲:基礎了解 importwxclass MyFrame(wx.Frame): #創建自定義Frame def...
繼續訪問
python人機交互界面設計_python_GUI頁面開發
GUI:人機交互圖形化界面,圖形頁面窗口,Windows系統就是一個龐大的GUI界面,比命令行更加讓人得以接受,使用更加簡便在python中的GUI界面是由tkinter提供的,使用前需導入變數 = tk.Tk():創建一個窗口,將他實例化變數 = geometry('長寬'):設置窗口的長寬頁面開發的最小內容:1.導入tkinter模塊2.創建主窗口對象3.將主窗口對象加入消息循環importt...
繼續訪問
python安裝pygame失敗_python下PyGame的下載與安裝過程及遇到問題
1.去官網下載PyGame注意:要下載對應版本的包其中,如果python為以下版本:(cp36就是python3.6的意思)2. .exe文件直接安裝.whl文件啟動doc命令安裝:在文件所在位置打開doc界面:(win10直接在當前文件夾空白處按住shift,右鍵打開powershell窗口)輸入以下指令安裝:pip install pygame-1.9.3-cp36-cp36m-win...
繼續訪問
基於Python的學生生活信息交互平台的設計和實現_天行IT科技館的博客-CS...
《基於Python的學生生活信息交互平台的設計和實現》該項目採用技術Python的django框架、mysql資料庫 ,項目含有源碼、論文、PPT、配套開發軟體、軟體安裝教程、項目發布教程、核心代碼介紹視頻等 軟體開發環境及開發工具: ...
繼續訪問
...python做互動式界面?_程序員小猴紫的博客_python交互...
界面設計:PyQt模塊,這個界面個人感覺是python中界面設計最好用的模塊,既可以使用窗口設計界面,又能使用CSS樣式。 2.界面設計 2.1打開PyQt designer界面 三步成界面,是不是很簡單,哈哈,你沒看錯,設計一個界面就是這么的簡單,當然我沒有...
繼續訪問
最新發布 python互聯網程序設計GUI程序設計和網路程序設計(人機互動聊天軟體)
(2)必備功能:伺服器客戶端之間能簡單發送和接收文件。至少應有序列化和反序列化功 能。收發雙方,應列印顯示發送或接收的原始對象的信息(非位元組串)。(1)必備功能:要求服務端代碼具有一定的智能,能夠根據不完整的問題識別客戶端真正 要問的問題。如客戶輸入how old, 伺服器能回答年齡。(1)測試TCP連接是否成功。(2)試接收信息是否完整。(4)測試其他無關鍵詞彙。(5)測試文件發送與接收。(3)測試智能回復聊天。(1)發送信息的函數。
繼續訪問
python人機交互界面設計_063 Python必備庫-從人機交互到藝術設計
一、概述Python庫之圖形用戶界面Python庫之游戲開發Python庫之虛擬現實Python庫之圖形藝術二、Python庫之圖形用戶界面2.1 PyQt5提供了創建Qt5程序的Python API介面Qt是非常成熟的跨平台桌面應用開發系統,完備GUI推薦的Python GUI開發第三方庫2.2 wxPython提供了專用於Python的跨平台GUI開發框架理解數據類型與索引的關系,操作索引即操...
繼續訪問
python編寫人機交互界面_中科院科研項目:人機交互—自然人機語音交互研究
本文來自微信公眾號——青人留學。中科院科研項目:人機交互—自然人機語音交互研究mp.weixin.qq.com項目簡介自上世紀90年代以來,隨著手寫識別、語音識別、網路通信技術的發展,人機交互已發生了巨變,一個完全不懂編程以及網路通信原理的普通小孩,可能會比計算機科學家和網路工程師更好地使用計算機。方式的變革使得人機交互變得簡單,而這個變革,就發生在短短不到30年內。可預見的是,未來計算機會更加...
繼續訪問
Pygame詳解:前言
Pygame官網:https://www.pygame.org Pygame的官網是有詳細的文檔的:https://www.pygame.org/docs/ 下圖是Pygame 的所有類和模塊,都有對應的文檔, 我做的就是 Pygame中文文檔,喜歡看英文原版的還是可以去看官網,不喜勿噴。 第一篇:Pygame詳解(一):Color類 ...
繼續訪問
cocos2d for python_Python版的cocos2d庫:一個2D游戲開發GUI框架的入門詳解
1 說明:=====1.1 cocos2d是一個基於MIT協議的開源框架,用於構建游戲、應用程序和其他圖形界面交互應用。1.2 不遜色於pygame,但是其實Python版的cocos2d庫是基於pygame和pyglet的,也就是集大成者。1.3 中文教程少的可憐,所以寫一個入門教程,把坑填了,親測過,注釋里有講解。1.4A 2D framework for games and multimed...
繼續訪問
python 游戲引擎 cocos2d_【Cocos2dx游戲開發】Cocos2d-x簡介
一、簡介最近在做一個Android下的卡牌游戲——《九州幻想》開發項目,而我們使用的引擎是Cocos2dx,所以想要寫寫筆記來記錄一下項目中的收獲。當然首先稍微介紹一下Cocos2d-x引擎:cocos2d-x是一個免費、開源、跨平台的2D游戲引擎。我們知道Cocos2d是一個基於MIT協議的開源框架,用於構建游戲、應用程序和其他圖形界面交互應用。最初cocos2d僅是一個用Python語言寫的游...
繼續訪問
python編寫人機交互界面_【021】重磅!人機交互設計項目(全下載)|1藍調百香果跨年熱文大賽作品...
項目4:人機交互設計項目───自動售貨程序設計梁玉華山東昌樂二中隨著科技的不斷發展,計算機的出現引發關於「人機交互」的研究已經有半個世紀的歷史。從最早的二進制大型計算機到現在的人工智慧,幾乎全世界的高科技精英們都在為人機交互的發展和前進不懈努力,未來人們生活的各個領域,人機交互將無處不在。自動售貨機是人機交互技術在生活中的一項典型應用,本項目將以「自動售貨程序設計」為主線,經歷生活...
繼續訪問
Python 計算生態概覽
文章目錄Python 計算生態概覽Python 計算程序設計思維Python 計算生態概覽從數據處理到人工智慧Python庫之數據分析Numpy: 表達N維數組的最基礎庫Pandas: Python數據分析高層次應用庫SciPy: 數學、科學和工程計算功能庫Python庫之數據可視化Matplotlib: 高質量的二維數據可視化功能庫Seaborn: 統計類數據可視化功能庫Mayavi:三維科學數據可視化功能庫Python庫之文本處理Pypdf2: 用來處理pdf文件的工具集NLTK: 自然語言文本處理第三
繼續訪問
利用Python+Cocos2d製作《貓吃老鼠》小游戲
因此,如果在代碼的其他位置更新過self.position(或者self.x或者self.y),千萬不要忘記調用update_cshape()更新cshape的位置。除了以上這幾個方法以外,CollisionManagerGrid類還定義了一些其他有用的方法,如they_collide(),any_near(),objs_near(),objs_near_wdistance(),ranked_objs_near(),iter_all_collisions()等,鑒於篇幅有限,不再一一介紹。
繼續訪問
Python實戰案例:Python使用cocos2d實現捕魚達人
Python實戰案例:Python使用cocos2d實現捕魚達人 游戲,它是一種基於物質需求滿足之上的,在一些特定時間、空間范圍內遵循某種特定規則的,追求精神世界需求滿足的社會行為方式。合理適度的游戲允許人類在模擬環境下挑戰和克服障礙,可以幫助人類開發智力、鍛煉思維和反應能力。一般的小型游戲都是一些隨機變化的事物,根據滑鼠或鍵盤的操作來完成對變化事物的點擊操作或者控制操作,最終實現娛樂的目的。 如下圖為地鐵跑酷的界面。 上圖中人就是一個控制的元素,通過控制人的左右和跳躍,最終對金幣進行累加的游戲。
繼續訪問
python 人機交互 輸入輸出以及格式處理
輸入函數:input() ; 輸出函數:print() 例子: x = input('請輸入:') input 函數接收的是字元串。 將字元串轉化為int 型方式 例子: x = input('請輸入x的值:') y = input('請輸入y的值: ') z = x + y print(z) 運行程序: 請輸入x的值:1 請輸入y的值:1 11 #列印變數z結果 x = input('請輸入x的值:') y = input('請輸入y的值: ') z = int(x) + int
繼續訪問
熱門推薦 python編程(關於cocos2d)
【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】 做游戲的同學大約對cocos2dx不會陌生,基本上做2d游戲都會用到這一款引擎。但是下載cocos2dx非常麻煩,不光文件很大,還要配置visual studio,所以我在想要是linux下面也有一款類似的軟體就好了。所以,趁周末找了找,沒想到還真有,這就是python版本的coco
繼續訪問
Pygame精靈和碰撞檢測
在開始學習相關知識點之前,我們有必要先學習精靈和碰撞檢測的含義。 精靈(英文譯為 Sprite),其實在一個游戲程序中,精靈本質指的是一張張小尺寸的圖片,比如游戲中的各種道具、人物、場景裝飾等,它們都可以看做成一張張小的「精靈」圖。除此之外,人物的移動也可以看做是一系列小精靈圖構成的序列(按幀組成的序列) 如果將逐幀分解後的動作,按照一定的頻率播放,那麼就形成了動畫精靈,您將會看到雄鷹展翅高飛、人在策馬奔騰、運動員奮力跳遠。 精靈有個特點就是允許精靈之間進行交互,也稱之為碰撞,而碰撞檢測,指的就是檢測兩個精
繼續訪問
python人機交互界面設計_python做一個gui
本人是做介面測試的,而很多介面現在對於安全方面有了很大的重視,所以往往在介面層上做了一些加密,比如MD5、AES、SHA之類的加密,而每次加密,都是自己利用python編寫腳本而生成sign值,這往往對於自己在工具效率上無法提高,所以就產生了自己編寫一個簡單的加密+請求介面的小工具的想法。因為本人現在主要是以python為主,所以在選擇的時候,就從這方面入手。許多人在學習如何創建一個 GUI 應用...
『柒』 如何用Python編寫一個聊天室
一、課程介紹
1.簡介
本次項目課是實現簡單聊天室程序的伺服器端和客戶端。
2.知識點
伺服器端涉及到asyncore、asynchat和socket這幾個模塊,客戶端用到了telnetlib、wx、time和thread這幾個模塊。
3.所需環境
本次課中編寫客戶端需要用到wxPython,它是一個GUI工具包,請先使用下面的命令安裝:
$ sudo apt-get install python-wxtools
密碼為shiyanlou
4.項目效果截圖
登錄窗口
二、項目實戰(伺服器端)
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('
')
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
' % 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.
')
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.
')
def do_say(self, session, line):
'客戶端發送消息'
self.broadcast(session.name + ': ' + line + '
')
def do_look(self, session, line):
'查看在線用戶'
session.push('Online Users:
')
for other in self.sessions:
session.push(other.name + '
')
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
' % 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.
')
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.
')
def do_say(self, session, line):
'客戶端發送消息'
self.broadcast(session.name + ': ' + line + '
')
def do_look(self, session, line):
'查看在線用戶'
session.push('Online Users:
')
for other in self.sessions:
session.push(other.name + '
')
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('
')
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):
"""
登錄窗口
『捌』 Python如何使用圖靈的API Key搭建聊天機器人
python是當下十分火爆的編程語言,尤其在人工智慧應用方面。如果有心蠢咐從事編程方向的工作,最好到專業機構深入學習、多實踐,橡檔鬧更貼近市場,梁罩這樣更有利於將來的發展。
『玖』 python聊天程序地址含義
執行指定圓蠢的運行指令即可。
導入文件時,其中的所有內容都將繼續運行。所以你現在所做的基手並不是實際並行運行兩個程序,import中的second.py語句指示運行first.py,然搏腔嫌後繼續執行其餘的指令。
執行此操作的pythonic方法只是通過import語句傳遞對象。我們可以定義具有rocket屬性的charge類,第二個程序檢查此屬性,然後通過方法添加到該屬性。
『拾』 利用Python語言,設計一個網路聊天程序,實現網路通信或者文件傳輸
這個是很有意思,也簡單的話題 。你可以使用twisted, 或者是socket, 實現。 如果想優美些可以用stackless,也可以用greenlet。
最簡單的辦法是使用內置的httpserver,通過多線程socketserver,和simplehttpserver實現簡單的交互。