python制作qq登录界面_electron 仿制QQ登录界面

2023-10-20 10:59

本文主要是介绍python制作qq登录界面_electron 仿制QQ登录界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先来看看qq的登录界面:

b13170f69ac71276535e6e1a0debf34c.png

准备开发

制作一个窗口先

主进程代码:

import {BrowserWindow, webContents, app, ipcMain} from 'electron'

LoginWindow(); //暂时调用

ipcMain.on('quitApp', () => {

app.quit();

});

function LoginWindow() {

const loginURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080/#/login` : `file://${__dirname}/index.html/#/login`;

const loginWindow = new BrowserWindow({

width: 430,

height: 328,

alwaysOnTop: true,

modal: true,

frame: false,

darkTheme: true,

resizable: false,

minimizable: false,

maximizable: false,

transparent: true,

webPreferences: {

devTools: false,

}

});

loginWindow.setMenu(null);

loginWindow.loadURL(loginURL);

}

界面基本布局

我们先大概做一个这样的界面

26256d664a7e406c5fc908cf5384416d.png

页面代码:

import '@/assets/css/login.css'

export default {

}

样式代码:

/**

取消全部的外边距和内边距

*/

* {

padding: 0;

margin: 0;

}

/*设置窗口的样式*/

.mainWindow {

cursor: pointer; /*设置手型*/

border: 1px solid red; /*加一个边框 调试样式 最后要删除或者更改**/

width: 428px; /*设置宽度 必须要和主进程中设置的一样 不能大于主进程中设置的宽度 否则会出现滚动条*/

height: 326px; /*设置高度 必须要和主进程中设置的一样 不能大于主进程中设置的高度 否则会出现滚动条*/

position: relative; /*设置为相对定位*/

border-radius: 4px; /*设置圆角*/

}

/**

header的样式 header中只会有一个关闭按钮 处于右上角

*/

.mainWindow header.header {

position: absolute; /*设置绝对定位 因为背景在他下面*/

height: 30px; /*设置高度*/

background: rgba(0, 0, 0, 0.5); /*暂时设置的 后面要删除或者更改*/

border-radius: 4px 4px 0 0; /*给header的左上角 右上角设置圆角 不然会出现很尴尬的页面*/

width: 428px; /* 因为设置了绝对定位 设置宽度*/

}

/**

背景

*/

.mainWindow main .bg {

height: 124px; /*设置高度*/

width: 428px; /*设置宽度 也可以不用设置 因为这个元素没有设置绝对定位 所以默认就是100%*/

border-radius: 4px 4px 0 0; /*给左上角 右上角设置圆角 不然会出现很尴尬的页面 这里和header重合在一起了*/

background: blue; /*暂时设置的 后面要删除或者更改*/

}

/**

放置表单的元素

*/

.mainWindow main .body {

width: 428px; /*设置宽度 也可以不用设置 因为这个元素没有设置绝对定位 所以默认就是100%*/

height: 172px; /*设置高度 这里的高度是 主窗口(326) - footer(30) - 背景(124) 因为header设置了绝对定位 所以不用关 */

background: green; /*暂时设置的 后面要删除或者更改*/

}

.mainWindow footer.footer {

position: absolute; /* 设置绝对定位 要让他处于窗口的最底部*/

height: 30px; /*设置高度 */

background: red; /*暂时设置的 后面要删除或者更改*/

bottom: 0; /*让footer处于底部*/

width: 428px; /* 因为设置了绝对定位 设置宽度*/

}

窗口拖动

注意 不要使用内置的拖动 我们要自己实现!

在页面中加入以下代码就可以实现拖动了!

data() {

return {

windowX: 0,

windowY: 0,

}

},

mounted() {

let win = this.$electron.remote.getCurrentWindow();

document.addEventListener('mousedown', function (e) {

this.windowX = e.x;

this.windowY = e.y;

document.addEventListener('mousemove', moveEvent);

});

document.addEventListener('mouseup', function () {

this.windowX = 0;

this.windowY = 0;

document.removeEventListener('mousemove', moveEvent)

});

function moveEvent(e) {

win.setPosition(e.screenX - this.windowX, e.screenY - this.windowY)

}

}

设置背景图

将css里面的 .bg修改成:

.mainWindow main .bg {

height: 124px; /*设置高度*/

width: 428px; /*设置宽度 也可以不用设置 因为这个元素没有设置绝对定位 所以默认就是100%*/

border-radius: 4px 4px 0 0; /*给左上角 右上角设置圆角 不然会出现很尴尬的页面 这里和header重合在一起了*/

background: url("../images/login-back.gif") 10px;

background-size: 100%;

}

完成之后效果如如下:

b9388a548ce3317e29f1159e24d8ea56.gif

制作顶部

顶部的logo和最小化就不做了 只做一个关闭的按钮

去阿里巴巴图标库下载字体文件之后放到assets/fonts目录中

在页面中加入:

import '@/assets/fonts/iconfont.css'

header代码:

css文件

注意 在css .mainWindow header.header 添加

由于我背景图的关系 按钮可能不太明显 这问题不大 大家可以自己换一个图!

background: rgba(255, 255, 255, 0.2); /*暂时设置的 后面要删除或者更改*/

text-align: right;

.mainWindow header.header span{

display: inline-block;

height: 30px;

width:30px;

text-align: center;

line-height: 30px;

color:#E4393c;

}

.mainWindow header.header span:hover{

background-color: rgba(255,255,255,0.6);

}

制作表单页

表单界面代码

创建一个子组件 login.vue

写入如下代码:

登录

export default {

name: "login"

}

表单页css

需要将 .mainWindow main .body 的背景颜色调成#FFFFFF

.form form{

padding:10px 90px 0 90px;

}

.form_item{

height: 40px;

position: relative;

}

.form_item i.iconfont{

position: absolute;

top:5px;

}

.form_item input{

outline: none;

border:none;

padding-left: 20px;

font-size: 16px;

width: 230px;

height: 30px;

border-bottom: 1px solid #CCC;

}

.buttons{

text-align: center;

}

.buttons button{

background-color: #CF000E;

border: none;

width: 250px;

color: #FFFFFF;

height: 35px;

cursor: pointer;

font-size: 14px;

border-radius: 4px;

outline: none;

}

效果

最后看到是这样的

298daf140640f5a5cb605ec1b7348c06.png

复选框美化

组件代码

css代码

.login_options{

margin-bottom: 10px;

margin-top: 5px;

}

.login_options .option_item {

display: inline-block;

width: 13px;

height: 13px;

margin-right: 5px;

position: relative;

border: 1px solid orange;

vertical-align: middle;

cursor: pointer;

top: -2px;

}

.login_options .option_item input {

opacity: 0;

}

.login_options i.text{

display: inline-block;

margin-right: 14px;

font-size: 13px;

font-style: normal;

}

.login_options .option_item span.checked {

position: absolute;

top: -4px;

right: -3px;

font-weight: bold;

display: inline-block;

width: 20px;

height: 20px;

cursor: pointer;

}

.option_item span.checked img {

width: 100%;

height: 100%;

}

input[type="checkbox"] + span {

opacity: 0;

}

input[type="checkbox"]:checked + span {

opacity: 1;

}

效果

7c989d1e69240ce36a1f68dbafe6da34.pnge2b83fe860a1cfd0ed8bb8ccfef3e20c.png

注册页面

我们改进一点 因为qq的注册是一个连接到web页面去申请qq号码的 不过我做的是点击注册将界面切换到注册界面,只不过是

在写注册界面代码之前先将父组件种的login注释掉备用 (别删除哦) 在父组件中引入Register组件

注册的逻辑是这样的 在注册界面输入手机号和图形验证码 获取到短信验证码输入之后跳转到下一步输入密码

如果将全部的逻辑写到一个组件中会导致太长 虽然有办法解决 但是之后使用动画就很难看了!

界面代码

获取短信验证码

下一步

export default {

name: "register"

}

界面Css代码

.captcha {

position: absolute;

width: 120px;

height: 30px;

top: -2px;

right: 0;

}

.captcha img {

width: 100%;

height: 100%;

}

.send_sms_captcha {

position: absolute;

top: -2px;

right: 0;

}

.send_sms_captcha button{

width:120px;

height: 30px;

border:none;

outline: none;

cursor: pointer;

border-radius: 4px;

}

父组件代码

部分代码:

效果

991d4fd189bac4d8d6e0d009376d25ad.png

注册步骤2

界面代码

登录

export default {

name: "steps2"

}

展示

ae818379916653cfb3686430183d9005.png

footer代码

jie简介

在上面中footer里面显示了注册账号

其实这只是暂时的方案 为了方便截图

首先来分析一下 在登录页面的时候在底部显示注册账号 在注册第一步的时候在底部左侧显示已经账号,在第二步骤的时候显示返回上一步

我们有很多办法在子组件通知父组件去显示不同的文字

作者给出两个方案:

1: 通过子组件给父组件传值

2: 使用vuex

3: 将footer拆分到各个组件中

我们代码中使用拆分就行了 比较简单点

将父组件的footer删除

往组件login.vue steps1.vue steps2.vue 组件中加入footer

login.vue:

登录

注册账号

export default {

name: "login",

methods:{

toggleWindow(){

this.$store.dispatch('toggleLogin');

}

}

}

steps1.vue

获取短信验证码

下一步

已有账号

export default {

name: "steps1",

methods:{

toggleWindow(){

this.$store.dispatch('toggleLogin');

},

toggleSteps(){

this.$store.dispatch('toggleSteps');

},

}

}

steps2.vue

注册

返回上一步

export default {

name: "steps2",

methods:{

toggleSteps(){

this.$store.dispatch('toggleSteps');

},

}

}

vuex 代码

const state = {

steps: true,

login: true,

};

const actions = {

toggleSteps: function ({state, commit}) {

// state.steps = true;

state.steps = !state.steps;

},

toggleLogin({state, commit}){

state.login = !state.login;

}

};

export default ({

state,

actions

});

效果展示

4c3f570e877eabee502f3df52eca0434.gif

添加动画效果

上面这些完成之后有点单调 尤其是切换的时候 我们可以用到 animateCss

animateCss 下载地址:https://daneden.github.io/ani...

子组件加入:

import '@/assets/css/animate.css'

之后我们在代码中加入效果就行了

将父组件改成:

:duration="500"

:enter-active-class="'animated ' + (login ? 'bounceInRight' : 'bounceInLeft')"

:leave-active-class="'animated ' + (login ? 'bounceOutLeft' : 'bounceOutRight')"

>

子组件 register.vue改成:

:duration="500"

:enter-active-class="'animated ' + (steps ? 'bounceInRight' : 'bounceInLeft')"

:leave-active-class="'animated ' + (steps ? 'bounceOutLeft' : 'bounceOutRight')"

>

修改下css 因为要使用动画就要将main定位才能用

加入:

.mainWindow main {

position: absolute;

}

效果展示:

6d6bada39afbcbe2f9d1a16614202cd0.gif

到这里就差不多了 代码太多没法一一发布上来 如果有需要的可以去github下载或者加QQ群 814270669

github地址:https://github.com/lihaotian0...

码云地址: https://gitee.com/leehaotian/...

我的github账号出了问题 一直登录不上去 所以就先发布到码云了

这篇关于python制作qq登录界面_electron 仿制QQ登录界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/246646

相关文章

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.