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函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图