由于去离校较远的地方实习,平时想连接实验室的电脑,只要得到电脑的IP地址即可。但是由于电脑的不稳定性导致意外重启之后就得不到IP地址了。所以萌生了想制作一个可以发IP地址的小软件。最终的目的是不管电脑出现什么情况,总是能接收到当前电脑的IP地址(前提是电脑可自动联网)。

一. 准备

由于时间不多,就花2天时间来制作,所以最后决定使用PYQT来制作。

语言:Python3.6

包:PyQt5,mysql

IDE:Pycharm

二. 制作思路

     1. 首先获取电脑的IP地址,用户名,mac地址

2. 实现登陆注册功能,可以将上面获取的信息存到服务器的用户信息里面

3. 制作一个小网站来显示IP地址

三. 实现

     1. 获取IP地址等信息代码较简单,部分代码如下。

computeMac = uuid.UUID(int=uuid.getnode()).hex[-12:]
computeMac=":".join([computeMac[e:e+2] for e in range(0,11,2)])
computerName = socket.gethostname()
computerIP = socket.gethostbyname(computerName)
conmputeUsername=getpass.getuser()

2. 实现登陆注册功能。下面只展示了按下登陆注册按钮以后的操作。至于怎么连接数据库,怎样验证请读者自己百度,这些代码较为简单。

    def login(self):"""按下登陆按钮的操作"""cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))#获取当前时间if(self.isLogin==False): #未登陆的操作if(self.connectToServer()):username=self.usernameEdit.text()password=self.passwordEdit.text()if(username=='' or password==''):self.logEdit.append(cueerntTime + "用户名或密码不能为空")else:sqlString="SELECT COUNT(username) FROM userinfo WHERE username='"+username+"' AND password='"+password+"'"self.cur.execute(sqlString)if(self.cur._rows[0][0]>0):#登陆成功self.logEdit.append(cueerntTime + "登陆成功!")self.isLogin=Trueself.usernameEdit.setEnabled(False)self.passwordEdit.setEnabled(False)self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/logoutButton.png);}""QPushButton:hover{border-image: url(:/image/logoutHoverButton.png);}")if(self.remerberBox.isChecked()):self.config['autoLogin'] = Trueself.config['remberPassword'] = Trueself.config['username'] =usernameself.config['password'] =passwordself.updateConfigFile()self.sendipThread.start()else:self.logEdit.append(cueerntTime + "登陆失败!请检查账户名和密码!!!")else:#登录后的操作self.isLogin = Falseself.usernameEdit.setEnabled(True)self.passwordEdit.setEnabled(True)self.logEdit.append(cueerntTime + "退出成功!!!")self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/loginButton.png);}""QPushButton:hover{border-image: url(:/image/loginHoverButton.png);}")

3.  网站制作的代码这里就不写了。

四. 结果

界面如下:

五. 未完成功能

1.依旧没能实现自动开机自启。本来打算通过修改注册表来实现开机自启,但是不知道什么原因,修改注册表后开机能够自己启动,但是会报错,实现该功能的函数依旧保留在原代码里面了。目前我是通过手动配置开机启动该软件。

2. 注册功能未完成

3. 如果电脑意外关机,仍然不能自动获取IP地址

六. 体验与源代码

1. 打包好的软件

链接: https://pan.baidu.com/s/1ZRoRfL3MwU6J57KTz7cpIA 密码: xy6i

2. 获取IP地址的网站: www.37300.top

用户名:test  密码:test  (客户端和网站都用这个用户名和密码)

3. github源代码

 https://github.com/651742112/getIP912/tree/master

4. CSDN源代码下载

https://download.csdn.net/download/q651742112/10585732  (第一版)

https://download.csdn.net/download/q651742112/10662938 (第二版)

5. 主界面源代码

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'home.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets  import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtCore import pyqtSignal
import pymysql
import os
import uuid
import socket
import getpass
import win32api
import win32con
import time
import image_rc
from PyQt5 import sip
import subprocess
import requests
import re
import time
import cgitb
cgitb.enable(format ='text')class Ui_HomePage(QWidget):""" 主页"""tipSignal = pyqtSignal(str) # 提示语def __init__(self):"""页面初始化"""super(Ui_HomePage, self).__init__()self.conn='' # 数据库连接参数self.cur=''self.isLogin=Falseself.tip="getip" # 系统托盘提示语if(os.path.exists("config.py")==False):# 不存在在配置文件的话就建立配置文件self.newConfigFile()self.config=self.loadCongfigFile('config.py')# 加载配置文件self.setupUi()if(self.config['remberPassword']==True):# 将配置文件中保存的帐户名和密码加到表单中self.usernameEdit.setText(self.config['username'])self.passwordEdit.setText(self.config['password'])self.remerberBox.toggle() # 将选择框打勾if(self.config['autoLogin']==True):self.loginIn()self.sendipThread = SendIPThread()  # 发送IP地址的线程self.sendipThread.start()self.sendipThread.senip.connect(self.sendIPToServer)self.monitorLoginThread=monitorLoginThread()self.monitorLoginThread.start()self.monitorLoginThread.monitorLogin.connect(self.monitorLogin)#self.startingUpWindow() # 开机自启def setupUi(self):"""主页上的控件""""""大部分是直接通过QT工具Designer生成UI,然后在其基础上修改了部分样式"""#主界面设置self.setObjectName("HomePage")self.resize(940, 500)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())self.setAttribute(Qt.WA_AlwaysStackOnTop)  # 始终保存窗口在最前面self.setSizePolicy(sizePolicy)self.setMinimumSize(QtCore.QSize(940, 500))self.setMaximumSize(QtCore.QSize(940, 500))self.setBaseSize(QtCore.QSize(1199, 650))self.setStyleSheet("color: rgb(26, 23, 17);\n""background-image: url(:/image/homeBg.png);")self.setInputMethodHints(QtCore.Qt.ImhHiddenText)#右侧登陆界面设置self.loginPage = QtWidgets.QWidget(self)self.loginPage.setGeometry(QtCore.QRect(370, 100, 545, 270))self.loginPage.setMinimumSize(QtCore.QSize(545, 270))self.loginPage.setMaximumSize(QtCore.QSize(545, 270))self.loginPage.setSizeIncrement(QtCore.QSize(545, 270))self.loginPage.setMouseTracking(False)self.loginPage.setContextMenuPolicy(QtCore.Qt.NoContextMenu)self.loginPage.setStyleSheet("background-image: url(:/image/loginBg.png);\n")self.loginPage.setObjectName("loginPage")#“登陆”文字self.loginText = QtWidgets.QWidget(self.loginPage)self.loginText.setGeometry(QtCore.QRect(40, 30, 44, 18))self.loginText.setMinimumSize(QtCore.QSize(44, 18))self.loginText.setMaximumSize(QtCore.QSize(44, 18))self.loginText.setSizeIncrement(QtCore.QSize(44, 18))self.loginText.setBaseSize(QtCore.QSize(44, 18))self.loginText.setStyleSheet("background-image: url(:/image/loginText.png);")self.loginText.setObjectName("loginText")#“注册”文字self.registText = QtWidgets.QWidget(self.loginPage)self.registText.setGeometry(QtCore.QRect(370, 30, 45, 19))self.registText.setMinimumSize(QtCore.QSize(45, 19))self.registText.setMaximumSize(QtCore.QSize(45, 19))self.registText.setSizeIncrement(QtCore.QSize(45, 19))self.registText.setBaseSize(QtCore.QSize(44, 19))self.registText.setStyleSheet("image: url(:/image/registText.png);")self.registText.setObjectName("registText")#“free accout”文字self.freeAccoutText = QtWidgets.QWidget(self.loginPage)self.freeAccoutText.setGeometry(QtCore.QRect(370, 60, 88, 13))self.freeAccoutText.setMinimumSize(QtCore.QSize(88, 13))self.freeAccoutText.setMaximumSize(QtCore.QSize(88, 13))self.freeAccoutText.setStyleSheet("image: url(:/image/freeAccount.png);")self.freeAccoutText.setObjectName("freeAccoutText")#“本软件不提供...”文字self.registticText = QtWidgets.QWidget(self.loginPage)self.registticText.setGeometry(QtCore.QRect(370, 90, 157, 56))self.registticText.setMinimumSize(QtCore.QSize(157, 56))self.registticText.setMaximumSize(QtCore.QSize(157, 56))self.registticText.setSizeIncrement(QtCore.QSize(157, 56))self.registticText.setBaseSize(QtCore.QSize(157, 56))self.registticText.setStyleSheet("image: url(:/image/registPrompt.png);")self.registticText.setObjectName("registticText")#用户名输入框self.usernameEdit = QtWidgets.QLineEdit(self.loginPage)self.usernameEdit.setGeometry(QtCore.QRect(60, 90, 271, 34))sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.usernameEdit.sizePolicy().hasHeightForWidth())self.usernameEdit.setSizePolicy(sizePolicy)self.usernameEdit.setMinimumSize(QtCore.QSize(271, 34))self.usernameEdit.setMaximumSize(QtCore.QSize(271, 34))self.usernameEdit.setSizeIncrement(QtCore.QSize(274, 34))self.usernameEdit.setBaseSize(QtCore.QSize(274, 34))palette = QtGui.QPalette()gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.HighlightedText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.HighlightedText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)self.usernameEdit.setPalette(palette)font = QtGui.QFont()self.usernameEdit.setFont(font)self.usernameEdit.setWhatsThis("")#输入框样式self.usernameEdit.setStyleSheet("border-radius:5px;\n"
"selection-color: rgb(255, 255, 255);\n"
"width: 100%; \n"
"height: 34px; \n"
"padding: 6px 12px; \n"
"font-size: 14px; \n"
"line-height: 1.428571429; \n"
"color:#fff; \n"
"vertical-align: middle; \n"
"color: qradialgradient(spread:repeat, cx:0.5, cy:0.5, radius:0.077, fx:0.5, fy:0.5, stop:0 rgba(255, 255, 255, 0), stop:0.497326 rgba(255, 255, 255, 0), stop:1 rgba(255, 255, 255, 0));\n"
"border: 1px solid #cccccc; \n"
"border-radius: 4px; \n"
"BACKGROUND-COLOR: transparent;")self.usernameEdit.setText("")self.usernameEdit.setMaxLength(20)self.usernameEdit.setReadOnly(False)self.usernameEdit.setProperty("setPlaceholderText(\"username\")", "")self.usernameEdit.setObjectName("usernameEdit")#密码输入框self.passwordEdit = QtWidgets.QLineEdit(self.loginPage)self.passwordEdit.setGeometry(QtCore.QRect(60, 140, 271, 34))self.passwordEdit.setMinimumSize(QtCore.QSize(271, 34))self.passwordEdit.setMaximumSize(QtCore.QSize(271, 34))self.passwordEdit.setSizeIncrement(QtCore.QSize(274, 34))self.passwordEdit.setBaseSize(QtCore.QSize(274, 34))self.passwordEdit.setEchoMode(QLineEdit.Password)palette = QtGui.QPalette()gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.HighlightedText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.HighlightedText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)gradient = QtGui.QRadialGradient(0.5, 0.5, 0.077, 0.5, 0.5)gradient.setSpread(QtGui.QGradient.RepeatSpread)gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)gradient.setColorAt(0.0, QtGui.QColor(0, 169, 255, 147))gradient.setColorAt(0.497326, QtGui.QColor(0, 0, 0, 147))gradient.setColorAt(1.0, QtGui.QColor(0, 169, 255, 147))brush = QtGui.QBrush(gradient)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush)brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.HighlightedText, brush)brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))brush.setStyle(QtCore.Qt.SolidPattern)palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)self.passwordEdit.setPalette(palette)font = QtGui.QFont()self.passwordEdit.setFont(font)self.passwordEdit.setWhatsThis("")self.passwordEdit.setStyleSheet("border-radius:5px;\n"
"selection-color: rgb(255, 255, 255);\n"
"width: 100%; \n"
"height: 34px; \n"
"padding: 6px 12px; \n"
"font-size: 14px; \n"
"line-height: 1.428571429; \n"
"color:#fff; \n"
"vertical-align: middle; \n"
"color: qradialgradient(spread:repeat, cx:0.5, cy:0.5, radius:0.077, fx:0.5, fy:0.5, stop:0 rgba(255, 255, 255, 0), stop:0.497326 rgba(255, 255, 255, 0), stop:1 rgba(255, 255, 255, 0));\n"
"border: 1px solid #cccccc; \n"
"border-radius: 4px; \n"
"BACKGROUND-COLOR: transparent;")self.passwordEdit.setMaxLength(20)self.passwordEdit.setProperty("setPlaceholderText(\"username\")", "")self.passwordEdit.setObjectName("passwordEdit")#登陆按钮self.loginButton = QtWidgets.QPushButton(self.loginPage)self.loginButton.setGeometry(QtCore.QRect(240, 200, 85, 33))self.loginButton.setMinimumSize(QtCore.QSize(85, 33))self.loginButton.setMaximumSize(QtCore.QSize(85, 33))self.loginButton.setSizeIncrement(QtCore.QSize(85, 33))self.loginButton.setBaseSize(QtCore.QSize(85, 33))self.loginButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))self.loginButton.clicked.connect(self.loginPress)#self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/logoutButton.png);}"#"QPushButton:hover{border-image: url(:/image/logoutHoverButton.png);}")self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/loginButton.png);}""QPushButton:hover{border-image: url(:/image/loginHoverButton.png);}")self.loginButton.setText("")self.loginButton.setObjectName("loginButton")#“remeber me”文字self.remerbermeText = QtWidgets.QWidget(self.loginPage)self.remerbermeText.setGeometry(QtCore.QRect(90, 220, 77, 13))self.remerbermeText.setMinimumSize(QtCore.QSize(77, 13))self.remerbermeText.setMaximumSize(QtCore.QSize(77, 13))self.remerbermeText.setSizeIncrement(QtCore.QSize(77, 13))self.remerbermeText.setBaseSize(QtCore.QSize(77, 13))self.remerbermeText.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)self.remerbermeText.setStyleSheet("image: url(:/image/rememberme.png);")self.remerbermeText.setObjectName("remerbermeText")self.remerberBox = QtWidgets.QCheckBox(self.loginPage)self.remerberBox.setGeometry(QtCore.QRect(70, 220, 13, 13))sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.remerberBox.sizePolicy().hasHeightForWidth())#“remeber me”选择框self.remerberBox.setSizePolicy(sizePolicy)self.remerberBox.setText("")self.remerberBox.setObjectName("remerberBox")self.registButton = QtWidgets.QPushButton(self.loginPage)self.registButton.setGeometry(QtCore.QRect(390, 160, 85, 33))self.registButton.setMinimumSize(QtCore.QSize(85, 33))self.registButton.setMaximumSize(QtCore.QSize(85, 33))self.registButton.setSizeIncrement(QtCore.QSize(85, 33))self.registButton.setBaseSize(QtCore.QSize(85, 33))self.registButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))self.registButton.setStyleSheet("QPushButton{border-image: url(:/image/registButton.png);}""QPushButton:hover{border-image: url(:/image/registhoverButton.png);}")self.registButton.setText("")self.registButton.setObjectName("registButton")self.loginText.raise_()self.registText.raise_()self.freeAccoutText.raise_()self.registticText.raise_()self.passwordEdit.raise_()self.loginButton.raise_()self.remerbermeText.raise_()self.remerberBox.raise_()self.registButton.raise_()self.usernameEdit.raise_()#日志框,即系统消息self.logWidget = QtWidgets.QWidget(self)self.logWidget.setGeometry(QtCore.QRect(50, 100, 235, 268))self.logWidget.setMinimumSize(QtCore.QSize(235, 268))self.logWidget.setStyleSheet("background-image: url(:/image/logBg.png);")self.logWidget.setObjectName("logWidget")#日志输出框self.logEdit = QtWidgets.QTextEdit(self.logWidget)self.logEdit.setGeometry(QtCore.QRect(30, 50, 181, 191))self.logEdit.setObjectName("logEdit")self.logEdit.setEnabled(False)self.systemMessgewidget = QtWidgets.QWidget(self.logWidget)self.systemMessgewidget.setGeometry(QtCore.QRect(70, 20, 87, 19))self.systemMessgewidget.setMinimumSize(QtCore.QSize(87, 19))self.systemMessgewidget.setMaximumSize(QtCore.QSize(87, 19))self.systemMessgewidget.setSizeIncrement(QtCore.QSize(87, 19))self.systemMessgewidget.setBaseSize(QtCore.QSize(87, 19))self.systemMessgewidget.setStyleSheet("background-image: url(:/image/systemMessage.png);")self.systemMessgewidget.setObjectName("systemMessgewidget")self.homebgwidget = QtWidgets.QWidget(self)self.homebgwidget.setGeometry(QtCore.QRect(0, 0, 941, 501))self.homebgwidget.setObjectName("homebgwidget")self.homebgwidget.raise_()self.loginPage.raise_()self.logWidget.raise_()self.retranslateUi(self)QtCore.QMetaObject.connectSlotsByName(self)self.systemTray = TrayIcon()  # 显示系统托盘self.systemTray.show()self.systemTray.showWindow.connect(self.showWindow) # 连接系统托盘的信号与槽self.systemTray.hideWindow.connect(self.hideWindow)self.systemTray.exitProgram.connect(self.exitProgram)self.tipSignal.connect(self.systemTray.setToolTip)def showWindow(self):"""显示窗体"""self.show()self.showNormal()def hideWindow(self):"""隐藏窗体"""self.hide()def exitProgram(self):"""退出程序""""保险起见,为了完整的退出"self.setVisible(False)qApp.quit()sys.exit()self.exit()def closeEvent(self, event):"""关闭事件"""event.ignore()self.hide()def retranslateUi(self, HomePage):_translate = QtCore.QCoreApplication.translateHomePage.setWindowTitle(_translate("HomePage", "getip"))HomePage.setWindowIcon(QIcon(":/image/getipTray.png"))self.usernameEdit.setPlaceholderText(_translate("HomePage", "username"))self.passwordEdit.setPlaceholderText(_translate("HomePage", "password"))def loginPress(self):"""按下登陆按钮的操作"""cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))  # 获取当前时间if (self.isLogin == False):  # 未登陆的操作self.loginIn()else:  # 本身是登录状态的操作self.loginOut()def loginIn(self):"""登陆"""cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))#获取当前时间if (self.connectToServer()):username=self.usernameEdit.text() #获取用户名和密码password=self.passwordEdit.text()if(username=='' or password==''):self.logEdit.append(cueerntTime + "用户名或密码不能为空")else:try:sqlString="SELECT COUNT(username) FROM userinfo WHERE username='"+username+"' AND password='"+password+"'"self.cur.execute(sqlString)if(self.cur._rows[0][0]>0): # 登陆成功self.logEdit.append(cueerntTime + "登陆成功!")self.isLogin=Trueself.usernameEdit.setEnabled(False)self.passwordEdit.setEnabled(False)self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/logoutButton.png);}" # 修改登陆按钮样式"QPushButton:hover{border-image: url(:/image/logoutHoverButton.png);}")if(self.remerberBox.isChecked()):self.config['autoLogin'] = Trueself.config['remberPassword'] = Trueself.config['username'] =usernameself.config['password'] =passwordself.updateConfigFile()else:self.logEdit.append(cueerntTime + "登陆失败!请检查账户名和密码!!!")except:self.logEdit.append(cueerntTime + "登陆失败!数据库查询出错")else:self.loginOut()def loginOut(self):'''退出'''cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))  # 获取当前时间self.isLogin = Falseself.usernameEdit.setEnabled(True)self.passwordEdit.setEnabled(True)self.logEdit.append(cueerntTime + "退出成功!!!")self.loginButton.setStyleSheet("QPushButton{border-image: url(:/image/loginButton.png);}"       # 修改登陆按钮样式"QPushButton:hover{border-image: url(:/image/loginHoverButton.png);}")def monitorLogin(self):'''监控自动登陆状态'''if(self.isLogin==False and self.config['remberPassword']==True):self.usernameEdit.setText(self.config['username'])self.passwordEdit.setText(self.config['password'])self.loginIn()def connectToServer (self):"""连接服务器数据库"""cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))try:self.conn = pymysql.connect(host='47.106.22.99', port=3306, user='getip', password='root', db='getip',charset='utf8')self.cur = self.conn.cursor()#self.logEdit.append(cueerntTime+"服务器连接成功")return Trueexcept:self.logEdit.append(cueerntTime+"服务器连接失败,请稍后重试")return Falsefinally:print("")def newConfigFile(self):"""建立配置文件"""configFile = "config.py"trans_fp = open(configFile, 'w')config={} # 默认配置config['autoLogin']=Trueconfig['remberPassword']=Falseconfig['username']=''config['password']=''trans_fp.write(str(config))trans_fp.close()def updateConfigFile(self):"""更新配置文件"""configFile = "config.py"trans_fp = open(configFile, 'w')trans_fp.write(str(self.config))trans_fp.close()def loadCongfigFile(self,filename):"""加载配置文件"""str = open(filename, 'r').read()return eval(str)def sendIPToServer(self):'''发送IP地址到服务器'''cueerntTime = time.strftime("%H:%M:%S::", time.localtime(time.time()))  # 获取当前时间if(self.isLogin==True):if (self.connectToServer()):try:username = self.usernameEdit.text()computeMac = uuid.UUID(int=uuid.getnode()).hex[-12:]computeMac=":".join([computeMac[e:e+2] for e in range(0,11,2)])computerName = socket.gethostname()#computerIP = socket.gethostbyname(computerName)response = requests.get("http://" + str(time.localtime().tm_year) + ".ip138.com/ic.asp")# 获取外网IP地址computerIP = re.search(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", response.content.decode(errors='ignore')).group(0)computeUsername=getpass.getuser()sqlString ="SELECT COUNT(username) FROM userip WHERE username='"+username+"' AND mac='"+computeMac+"'" # 查询主机是否存在于数据中self.cur.execute(sqlString)if (self.cur._rows[0][0] > 0):  # 数据库表存在用户名和MAC,则更新sqlString="UPDATE userip SET loginname='"+computeUsername+"', ip='"+computerIP+"',lastupdatetime=NOW() ,isonline='ON' WHERE username='"+username+"' AND mac='"+computeMac+"'"self.cur.execute(sqlString)self.conn.commit()else:sqlString="INSERT INTO userip(username,mac,loginname,ip,lastupdatetime) VALUES('"+username+"','"+computeMac+"','"+computeUsername+"','"+computerIP+"',NOW())"self.cur.execute(sqlString)self.conn.commit()self.tip=computeUsername+":"+computerIPself.tipSignal.emit(self.tip)print("正在发送IP")except:print("发送IP地址错误")else:self.loginOut()def startingUpWindow(self):"""实现开机自启"""name = 'oftpublic'  # 要添加的项值名称print()path = os.getcwd()+'\getip.exe'  # 要添加的exe路径# 注册表项名KeyName = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'# 异常处理try:key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KeyName, 0, win32con.KEY_ALL_ACCESS)win32api.RegSetValueEx(key, name, 0, win32con.REG_SZ, path)win32api.RegCloseKey(key)except:print('error')print('开机启动成功!')class SendIPThread(QtCore.QThread):senip = pyqtSignal()def __init__(self, parent=None):QtCore.QThread.__init__(self, parent)def run(self):# 每个两秒向服务器更新一次IP地址即其他参数while(True):self.sleep(2)self.senip.emit()class monitorLoginThread(QtCore.QThread):monitorLogin = pyqtSignal() # 监控登陆状态的信号def __init__(self, parent=None):QtCore.QThread.__init__(self, parent)def run(self): # 每15秒查看是否处于登陆状态while(True):self.sleep(15)self.monitorLogin.emit()class TrayIcon(QSystemTrayIcon):hideWindow = pyqtSignal()  # 隐藏窗体信号exitProgram = pyqtSignal()  # 退出程序信号showWindow = pyqtSignal()  # 显示窗体信号def __init__(self, parent=None):super(TrayIcon, self).__init__(parent)self.createAction()self.createTrayIcon()self.icon = QIcon(":/image/getipTray.png")  # 创建图标self.setIcon(self.icon)self.setToolTip("getip")self.activated.connect(self.iconClick)def createAction(self):'''创建动作'''self.quitAction=QAction("退出",self,triggered=self.quit)def createTrayIcon(self):'''设置菜单'''self.trayIconMenu = QMenu()self.trayIconMenu.addAction(self.quitAction)self.setContextMenu(self.trayIconMenu)def iconClick(self, reason):"""鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击"""if reason==1: #右键self.trayIconMenu.show()else: # 其他按键self.showWindow.emit()def quit(self):self.exitProgram.emit()def setTip(self,str):self.setToolTip(str)if __name__ == "__main__":app = QApplication(sys.argv)mainMindow = Ui_HomePage()mainMindow.show()sys.exit(app.exec_())

七. 说明

1. 网站服务器在阿里云上

2. 所有数据都不受保护

3. 数据库连接等操作源码都有,暂时不会关闭该数据库

pyqt制作自动获取电脑IP地址的软件(含源代码)相关推荐

  1. vue 项目使用 webpack 构建自动获取电脑ip地址

    1.开发 H5 时移动端,经常会使用真机进行调试本地环境.webpack 配置服务器好多脚手架写的都是固定的,而在团队开发中需要每人配置自己的本机 ip 进行开发,每次开启开发环境的都需要修改,并且还 ...

  2. java自动获取ip_java自动获取电脑ip和MAC地址

    java自动获取电脑ip和MAC地址 利用getLocalHost获得计算机名称和ip getByInetAddress可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入 用get ...

  3. 利用python写一个自动获取局域网ip地址并开启服务器绕过校园网设备限制的小工具

    前言 ​ 这个学年学校把宽带运营商从之前的联通大哥哥换成了如今的电信小弟弟,使用体验可谓一落千丈,最主要的原因是电信不再像联通提供拨号上网的账号和密码,改成了强制使用天翼校园的程序来进行认证上网,而且 ...

  4. html 获取电脑ip地址,笔记本自动获取ip地址怎么设置?

    问:笔记本自动获取ip地址怎么设置? 答:笔记本电脑IP地址设置为自动获取的方法,其实并不复杂,只需要找到.打开"网络连接"选项,在该选项下打开"本地连接"或者 ...

  5. js返回计算机ip地址吗,js获取电脑IP地址???电脑连WIFI的

    下面是获取计算机名Mac地址和IP的代码HTML> js获取本机mac地址,IP地址,计算机名

  6. 电脑ip地址修改软件哪个比较好用

    在选择改IP软件时,我们要考虑以下几个因素: 1.是否稳定可靠:改IP软件需要保证其稳定性和可靠性,以免在使用时出现问题. 2.是否安全可靠:改IP软件需要保证其安全性,以免用户的真实IP地址被泄露或 ...

  7. 获取电脑IP地址以及hostname

    #!/usr/bin/env python #encoding: utf-8import socketip_addr = socket.gethostbyname(socket.gethostname ...

  8. linux系统自动获取ip地址,Linux系统下设置静态IP或自动获取动态IP的简单方法

    Linux下为机器设置静态IP地址: 复制代码 代码如下: vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改这个文件内容如下形式: 复制代码 代码如下: ...

  9. 用python检测电脑IP地址是否发生变化并提醒自己

    前言 有时候我们需要电脑的IP地址进行远程访问或者作其他用途,倘若自己的IP是动态分配且无法固定的话,某一时候IP地址突然变更了而自己不知道那倒是挺折腾人的.特别是在别的地方想要远程自己的电脑的时候, ...

最新文章

  1. 04Strategy(策略)模式
  2. Pytorch(八) --Pytorch实现多分类问题
  3. ARP协议,以及ARP欺骗
  4. 第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波
  5. Java 三大特性 —— 多态
  6. java-linux-eclipse配置
  7. 的向上取整函数_计算机二级Excel常用函数解析
  8. mysql 自动维护uuid_MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路...
  9. 蓝桥杯2019年第十届C/C++省赛B组第九题-后缀表达式
  10. 【精读论文】2015-BMVC-Learning Deep Representations of Appearance and Motion for Anomalous Event Detection
  11. 计算机睡眠与休眠有什么区别,小编教你电脑睡眠和休眠的区别是什么.
  12. 中国女性出席1899年伦敦世界妇女大会
  13. win10office2016计算机试题,大学计算机基础(Windows10+Office2016)试卷6(含答案).docx
  14. JDK官方下载(旧版本,以前老版本)
  15. (已解决)ubuntu16.04蓝牙耳机与电脑配对成功,但不出现在声音输出设备里
  16. 谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
  17. Gate 用户手册(一)总体概念
  18. 基于webrtc技术的远程桌面控制系统(一)
  19. 中国高科技、高成长50强
  20. Scrapy 爬取贴吧的例子

热门文章

  1. 才发现网易相册已于2019年5月8号停止运营,如何导出相册照片:http://photo.163.com/transfer/html/login , 使用相册帐号登录,提供真实姓名、手机号码
  2. Python-matplotlib用法
  3. oracle安装成功验证
  4. java 定时器 倒计时_Java:多种方式实现倒计时定时器
  5. 下载好看的壁纸,这五个网站就够了
  6. 小米AX1800开SSH权限
  7. 华为鸿蒙系统研发砸了多少钱,5000研发人员,打造生态系统砸10亿美元,为鸿蒙华为几乎不惜代价!...
  8. 抗病毒软件供应商担心恶意软件生产速度
  9. 英文学习20180327
  10. 迭代器模式(实际运用比较少)