└── PyQt登录界面 ├── .idea ├── PyQt登录界面.iml ├── dataSources.local.xml ├── dataSources.xml ├── dataSources │ ├── 5159cf7d-6e73-4f33-aa54-1ada41e6f2ec.xml │ └── 5159cf7d-6e73-4f33-aa54-1ada41e6f2ec │ │ └── storage_v2 │ │ └── _src_ │ │ └── schema │ │ └── information_schema.FNRwLQ.meta ├── inspectionProfiles │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── sqldialects.xml └── workspace.xml ├── Admin.py ├── Database.py ├── IMG ├── display.gif ├── flow.png ├── logic.png ├── python-logo.png ├── python.png └── welcome.jpg ├── Login.py ├── Main.py ├── README.md ├── Sign_Up.py ├── __pycache__ ├── Admin.cpython-37.pyc ├── Database.cpython-37.pyc ├── Login.cpython-37.pyc ├── Main.cpython-37.pyc └── Sign_Up.cpython-37.pyc └── data.db /PyQt登录界面/.idea/PyQt登录界面.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/dataSources.local.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #@ 7 | ` 8 | 9 | 10 | master_key 11 | root 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/dataSources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mysql.8 6 | true 7 | com.mysql.cj.jdbc.Driver 8 | jdbc:mysql://localhost:3306 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/dataSources/5159cf7d-6e73-4f33-aa54-1ada41e6f2ec.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8.0.18 6 | InnoDB 7 | InnoDB 8 | lower/lower 9 | 10 | 11 | 1 12 | utf8mb4_0900_ai_ci 13 | 14 | 15 | utf8_general_ci 16 | 17 | 18 | utf8mb4_0900_ai_ci 19 | 20 | 21 | utf8mb4_0900_ai_ci 22 | 23 | 24 | utf8mb4_0900_ai_ci 25 | 26 | 27 | utf8mb4_0900_ai_ci 28 | 29 | 30 | utf8mb4_0900_ai_ci 31 | 32 | 33 | armscii8 34 | 0 35 | 36 | 37 | armscii8 38 | 1 39 | 40 | 41 | ascii 42 | 0 43 | 44 | 45 | ascii 46 | 1 47 | 48 | 49 | big5 50 | 0 51 | 52 | 53 | big5 54 | 1 55 | 56 | 57 | binary 58 | 1 59 | 60 | 61 | cp1250 62 | 0 63 | 64 | 65 | cp1250 66 | 0 67 | 68 | 69 | cp1250 70 | 0 71 | 72 | 73 | cp1250 74 | 1 75 | 76 | 77 | cp1250 78 | 0 79 | 80 | 81 | cp1251 82 | 0 83 | 84 | 85 | cp1251 86 | 0 87 | 88 | 89 | cp1251 90 | 1 91 | 92 | 93 | cp1251 94 | 0 95 | 96 | 97 | cp1251 98 | 0 99 | 100 | 101 | cp1256 102 | 0 103 | 104 | 105 | cp1256 106 | 1 107 | 108 | 109 | cp1257 110 | 0 111 | 112 | 113 | cp1257 114 | 1 115 | 116 | 117 | cp1257 118 | 0 119 | 120 | 121 | cp850 122 | 0 123 | 124 | 125 | cp850 126 | 1 127 | 128 | 129 | cp852 130 | 0 131 | 132 | 133 | cp852 134 | 1 135 | 136 | 137 | cp866 138 | 0 139 | 140 | 141 | cp866 142 | 1 143 | 144 | 145 | cp932 146 | 0 147 | 148 | 149 | cp932 150 | 1 151 | 152 | 153 | dec8 154 | 0 155 | 156 | 157 | dec8 158 | 1 159 | 160 | 161 | eucjpms 162 | 0 163 | 164 | 165 | eucjpms 166 | 1 167 | 168 | 169 | euckr 170 | 0 171 | 172 | 173 | euckr 174 | 1 175 | 176 | 177 | gb18030 178 | 0 179 | 180 | 181 | gb18030 182 | 1 183 | 184 | 185 | gb18030 186 | 0 187 | 188 | 189 | gb2312 190 | 0 191 | 192 | 193 | gb2312 194 | 1 195 | 196 | 197 | gbk 198 | 0 199 | 200 | 201 | gbk 202 | 1 203 | 204 | 205 | geostd8 206 | 0 207 | 208 | 209 | geostd8 210 | 1 211 | 212 | 213 | greek 214 | 0 215 | 216 | 217 | greek 218 | 1 219 | 220 | 221 | hebrew 222 | 0 223 | 224 | 225 | hebrew 226 | 1 227 | 228 | 229 | hp8 230 | 0 231 | 232 | 233 | hp8 234 | 1 235 | 236 | 237 | keybcs2 238 | 0 239 | 240 | 241 | keybcs2 242 | 1 243 | 244 | 245 | koi8r 246 | 0 247 | 248 | 249 | koi8r 250 | 1 251 | 252 | 253 | koi8u 254 | 0 255 | 256 | 257 | koi8u 258 | 1 259 | 260 | 261 | latin1 262 | 0 263 | 264 | 265 | latin1 266 | 0 267 | 268 | 269 | latin1 270 | 0 271 | 272 | 273 | latin1 274 | 0 275 | 276 | 277 | latin1 278 | 0 279 | 280 | 281 | latin1 282 | 0 283 | 284 | 285 | latin1 286 | 0 287 | 288 | 289 | latin1 290 | 1 291 | 292 | 293 | latin2 294 | 0 295 | 296 | 297 | latin2 298 | 0 299 | 300 | 301 | latin2 302 | 0 303 | 304 | 305 | latin2 306 | 1 307 | 308 | 309 | latin2 310 | 0 311 | 312 | 313 | latin5 314 | 0 315 | 316 | 317 | latin5 318 | 1 319 | 320 | 321 | latin7 322 | 0 323 | 324 | 325 | latin7 326 | 0 327 | 328 | 329 | latin7 330 | 1 331 | 332 | 333 | latin7 334 | 0 335 | 336 | 337 | macce 338 | 0 339 | 340 | 341 | macce 342 | 1 343 | 344 | 345 | macroman 346 | 0 347 | 348 | 349 | macroman 350 | 1 351 | 352 | 353 | sjis 354 | 0 355 | 356 | 357 | sjis 358 | 1 359 | 360 | 361 | swe7 362 | 0 363 | 364 | 365 | swe7 366 | 1 367 | 368 | 369 | tis620 370 | 0 371 | 372 | 373 | tis620 374 | 1 375 | 376 | 377 | ucs2 378 | 0 379 | 380 | 381 | ucs2 382 | 0 383 | 384 | 385 | ucs2 386 | 0 387 | 388 | 389 | ucs2 390 | 0 391 | 392 | 393 | ucs2 394 | 0 395 | 396 | 397 | ucs2 398 | 0 399 | 400 | 401 | ucs2 402 | 1 403 | 404 | 405 | ucs2 406 | 0 407 | 408 | 409 | ucs2 410 | 0 411 | 412 | 413 | ucs2 414 | 0 415 | 416 | 417 | ucs2 418 | 0 419 | 420 | 421 | ucs2 422 | 0 423 | 424 | 425 | ucs2 426 | 0 427 | 428 | 429 | ucs2 430 | 0 431 | 432 | 433 | ucs2 434 | 0 435 | 436 | 437 | ucs2 438 | 0 439 | 440 | 441 | ucs2 442 | 0 443 | 444 | 445 | ucs2 446 | 0 447 | 448 | 449 | ucs2 450 | 0 451 | 452 | 453 | ucs2 454 | 0 455 | 456 | 457 | ucs2 458 | 0 459 | 460 | 461 | ucs2 462 | 0 463 | 464 | 465 | ucs2 466 | 0 467 | 468 | 469 | ucs2 470 | 0 471 | 472 | 473 | ucs2 474 | 0 475 | 476 | 477 | ucs2 478 | 0 479 | 480 | 481 | ucs2 482 | 0 483 | 484 | 485 | ujis 486 | 0 487 | 488 | 489 | ujis 490 | 1 491 | 492 | 493 | utf16 494 | 0 495 | 496 | 497 | utf16 498 | 0 499 | 500 | 501 | utf16 502 | 0 503 | 504 | 505 | utf16 506 | 0 507 | 508 | 509 | utf16 510 | 0 511 | 512 | 513 | utf16 514 | 0 515 | 516 | 517 | utf16 518 | 1 519 | 520 | 521 | utf16 522 | 0 523 | 524 | 525 | utf16 526 | 0 527 | 528 | 529 | utf16 530 | 0 531 | 532 | 533 | utf16 534 | 0 535 | 536 | 537 | utf16 538 | 0 539 | 540 | 541 | utf16 542 | 0 543 | 544 | 545 | utf16 546 | 0 547 | 548 | 549 | utf16 550 | 0 551 | 552 | 553 | utf16 554 | 0 555 | 556 | 557 | utf16 558 | 0 559 | 560 | 561 | utf16 562 | 0 563 | 564 | 565 | utf16 566 | 0 567 | 568 | 569 | utf16 570 | 0 571 | 572 | 573 | utf16 574 | 0 575 | 576 | 577 | utf16 578 | 0 579 | 580 | 581 | utf16 582 | 0 583 | 584 | 585 | utf16 586 | 0 587 | 588 | 589 | utf16 590 | 0 591 | 592 | 593 | utf16 594 | 0 595 | 596 | 597 | utf16le 598 | 0 599 | 600 | 601 | utf16le 602 | 1 603 | 604 | 605 | utf32 606 | 0 607 | 608 | 609 | utf32 610 | 0 611 | 612 | 613 | utf32 614 | 0 615 | 616 | 617 | utf32 618 | 0 619 | 620 | 621 | utf32 622 | 0 623 | 624 | 625 | utf32 626 | 0 627 | 628 | 629 | utf32 630 | 1 631 | 632 | 633 | utf32 634 | 0 635 | 636 | 637 | utf32 638 | 0 639 | 640 | 641 | utf32 642 | 0 643 | 644 | 645 | utf32 646 | 0 647 | 648 | 649 | utf32 650 | 0 651 | 652 | 653 | utf32 654 | 0 655 | 656 | 657 | utf32 658 | 0 659 | 660 | 661 | utf32 662 | 0 663 | 664 | 665 | utf32 666 | 0 667 | 668 | 669 | utf32 670 | 0 671 | 672 | 673 | utf32 674 | 0 675 | 676 | 677 | utf32 678 | 0 679 | 680 | 681 | utf32 682 | 0 683 | 684 | 685 | utf32 686 | 0 687 | 688 | 689 | utf32 690 | 0 691 | 692 | 693 | utf32 694 | 0 695 | 696 | 697 | utf32 698 | 0 699 | 700 | 701 | utf32 702 | 0 703 | 704 | 705 | utf32 706 | 0 707 | 708 | 709 | utf8 710 | 0 711 | 712 | 713 | utf8 714 | 0 715 | 716 | 717 | utf8 718 | 0 719 | 720 | 721 | utf8 722 | 0 723 | 724 | 725 | utf8 726 | 0 727 | 728 | 729 | utf8 730 | 0 731 | 732 | 733 | utf8 734 | 1 735 | 736 | 737 | utf8 738 | 0 739 | 740 | 741 | utf8 742 | 0 743 | 744 | 745 | utf8 746 | 0 747 | 748 | 749 | utf8 750 | 0 751 | 752 | 753 | utf8 754 | 0 755 | 756 | 757 | utf8 758 | 0 759 | 760 | 761 | utf8 762 | 0 763 | 764 | 765 | utf8 766 | 0 767 | 768 | 769 | utf8 770 | 0 771 | 772 | 773 | utf8 774 | 0 775 | 776 | 777 | utf8 778 | 0 779 | 780 | 781 | utf8 782 | 0 783 | 784 | 785 | utf8 786 | 0 787 | 788 | 789 | utf8 790 | 0 791 | 792 | 793 | utf8 794 | 0 795 | 796 | 797 | utf8 798 | 0 799 | 800 | 801 | utf8 802 | 0 803 | 804 | 805 | utf8 806 | 0 807 | 808 | 809 | utf8 810 | 0 811 | 812 | 813 | utf8 814 | 0 815 | 816 | 817 | utf8 818 | 0 819 | 820 | 821 | utf8mb4 822 | 1 823 | 824 | 825 | utf8mb4 826 | 0 827 | 828 | 829 | utf8mb4 830 | 0 831 | 832 | 833 | utf8mb4 834 | 0 835 | 836 | 837 | utf8mb4 838 | 0 839 | 840 | 841 | utf8mb4 842 | 0 843 | 844 | 845 | utf8mb4 846 | 0 847 | 848 | 849 | utf8mb4 850 | 0 851 | 852 | 853 | utf8mb4 854 | 0 855 | 856 | 857 | utf8mb4 858 | 0 859 | 860 | 861 | utf8mb4 862 | 0 863 | 864 | 865 | utf8mb4 866 | 0 867 | 868 | 869 | utf8mb4 870 | 0 871 | 872 | 873 | utf8mb4 874 | 0 875 | 876 | 877 | utf8mb4 878 | 0 879 | 880 | 881 | utf8mb4 882 | 0 883 | 884 | 885 | utf8mb4 886 | 0 887 | 888 | 889 | utf8mb4 890 | 0 891 | 892 | 893 | utf8mb4 894 | 0 895 | 896 | 897 | utf8mb4 898 | 0 899 | 900 | 901 | utf8mb4 902 | 0 903 | 904 | 905 | utf8mb4 906 | 0 907 | 908 | 909 | utf8mb4 910 | 0 911 | 912 | 913 | utf8mb4 914 | 0 915 | 916 | 917 | utf8mb4 918 | 0 919 | 920 | 921 | utf8mb4 922 | 0 923 | 924 | 925 | utf8mb4 926 | 0 927 | 928 | 929 | utf8mb4 930 | 0 931 | 932 | 933 | utf8mb4 934 | 0 935 | 936 | 937 | utf8mb4 938 | 0 939 | 940 | 941 | utf8mb4 942 | 0 943 | 944 | 945 | utf8mb4 946 | 0 947 | 948 | 949 | utf8mb4 950 | 0 951 | 952 | 953 | utf8mb4 954 | 0 955 | 956 | 957 | utf8mb4 958 | 0 959 | 960 | 961 | utf8mb4 962 | 0 963 | 964 | 965 | utf8mb4 966 | 0 967 | 968 | 969 | utf8mb4 970 | 0 971 | 972 | 973 | utf8mb4 974 | 0 975 | 976 | 977 | utf8mb4 978 | 0 979 | 980 | 981 | utf8mb4 982 | 0 983 | 984 | 985 | utf8mb4 986 | 0 987 | 988 | 989 | utf8mb4 990 | 0 991 | 992 | 993 | utf8mb4 994 | 0 995 | 996 | 997 | utf8mb4 998 | 0 999 | 1000 | 1001 | utf8mb4 1002 | 0 1003 | 1004 | 1005 | utf8mb4 1006 | 0 1007 | 1008 | 1009 | utf8mb4 1010 | 0 1011 | 1012 | 1013 | utf8mb4 1014 | 0 1015 | 1016 | 1017 | utf8mb4 1018 | 0 1019 | 1020 | 1021 | utf8mb4 1022 | 0 1023 | 1024 | 1025 | utf8mb4 1026 | 0 1027 | 1028 | 1029 | utf8mb4 1030 | 0 1031 | 1032 | 1033 | utf8mb4 1034 | 0 1035 | 1036 | 1037 | utf8mb4 1038 | 0 1039 | 1040 | 1041 | utf8mb4 1042 | 0 1043 | 1044 | 1045 | utf8mb4 1046 | 0 1047 | 1048 | 1049 | utf8mb4 1050 | 0 1051 | 1052 | 1053 | utf8mb4 1054 | 0 1055 | 1056 | 1057 | utf8mb4 1058 | 0 1059 | 1060 | 1061 | utf8mb4 1062 | 0 1063 | 1064 | 1065 | utf8mb4 1066 | 0 1067 | 1068 | 1069 | utf8mb4 1070 | 0 1071 | 1072 | 1073 | utf8mb4 1074 | 0 1075 | 1076 | 1077 | utf8mb4 1078 | 0 1079 | 1080 | 1081 | utf8mb4 1082 | 0 1083 | 1084 | 1085 | utf8mb4 1086 | 0 1087 | 1088 | 1089 | utf8mb4 1090 | 0 1091 | 1092 | 1093 | utf8mb4 1094 | 0 1095 | 1096 | 1097 | utf8mb4 1098 | 0 1099 | 1100 | 1101 | utf8mb4 1102 | 0 1103 | 1104 | 1105 | utf8mb4 1106 | 0 1107 | 1108 | 1109 | utf8mb4 1110 | 0 1111 | 1112 | 1113 | utf8mb4 1114 | 0 1115 | 1116 | 1117 | utf8mb4 1118 | 0 1119 | 1120 | 1121 |
1122 | 1123 | 1 1124 | int(11)|0s 1125 | normal 1126 | 1127 | 1128 | 2 1129 | varchar(255)|0s 1130 | normal 1131 | 1132 | 1133 | 3 1134 | varchar(255)|0s 1135 | normal 1136 | 1137 | 1138 | 4 1139 | varchar(255)|0s 1140 | normal 1141 | 1142 | 1143 | 5 1144 | varchar(255)|0s 1145 | normal 1146 | 1147 | 1148 | 1 1149 | int(11)|0s 1150 | 1 1151 | normal 1152 | 1153 | 1154 | 2 1155 | varchar(200)|0s 1156 | 1 1157 | normal 1158 | 1159 | 1160 | 3 1161 | int(11)|0s 1162 | 1 1163 | normal 1164 | 1165 | 1166 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/dataSources/5159cf7d-6e73-4f33-aa54-1ada41e6f2ec/storage_v2/_src_/schema/information_schema.FNRwLQ.meta: -------------------------------------------------------------------------------- 1 | #n:information_schema 2 | ! [null, 0, null, null, -2147483648, -2147483648] 3 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/sqldialects.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /PyQt登录界面/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 1575453317036 220 | 234 | 235 | 236 | 237 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | -------------------------------------------------------------------------------- /PyQt登录界面/Admin.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | Author: Edgar 4 | Version: 1.0.0 5 | Create time: 2019 12 6 | Modified time: 2019 12-10 7 | Function: 该模块为管理员用来管理所有的用户信息的模块,只有管理员才能进入,且管理员的账号一定为 admin, 8 | 数据库中必含有admin这个账号名,如果被删除,会自动生成默认的admin及默认密码 admin123 9 | """ 10 | import sys 11 | from PyQt5.QtWidgets import QWidget, QApplication, QTableWidget, QAbstractItemView, QMessageBox, QTableWidgetItem, \ 12 | QLineEdit, QPushButton, QHeaderView, QLabel, QCheckBox, QHBoxLayout 13 | from PyQt5.QtGui import QFont, QIcon 14 | from PyQt5.QtCore import Qt 15 | from Database import Database 16 | 17 | 18 | class AdminWindow(QWidget): 19 | def __init__(self): 20 | super().__init__() 21 | self.table = QTableWidget(self) # 添加表格对象 22 | self.database = Database('./data.db') 23 | self.check_list = [] # 保存所有的选择框 24 | self.show_password_flag = False # 是否显示原密码 25 | self.select_all_flag = False # 是否选择全部 26 | self.main_window = None 27 | self.set_ui() 28 | 29 | def set_main_window(self, widget): 30 | self.main_window = widget 31 | 32 | def set_ui(self): 33 | self.setWindowTitle("Management page") 34 | self.setFixedSize(1200, 900) 35 | self.font = QFont("Consolas") 36 | self.setFont(self.font) 37 | self.setWindowIcon(QIcon("./IMG/python-logo.png")) # 设置图标 38 | self.add_table() # 添加数据表格 39 | self.get_all_user() # add table 之后才有show 40 | self.add_line_edit() # 添加输入框 41 | self.add_label() # 添加标签 42 | self.add_button() # 添加按钮并绑定事件 43 | 44 | def add_table(self): 45 | """添加数据表格""" 46 | self.table.setFixedWidth(1020) # 设置宽度 47 | self.table.setFixedHeight(600) # 设置高度 48 | self.table.move(10, 30) # 设置显示的位置 49 | self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 自动填充 50 | self.table.horizontalHeader().setFont(self.font) # 设置一下字体 51 | # self.table.setSelectionMode(QAbstractItemView.SingleSelection) # 只能单选 52 | self.table.setSelectionBehavior(QAbstractItemView.SelectRows) # 只能选择整行 53 | self.table.setColumnCount(4) # 设置列数 54 | self.table.setHorizontalHeaderLabels(["Choice", "username", "password", 'created_time']) # 设置首行 55 | self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) # 表格中的内容设置为无法修改 56 | self.table.verticalHeader().hide() # 把序号隐藏 57 | self.table.setSortingEnabled(False) # 自动排序 58 | 59 | def get_all_user(self): 60 | """获取所有的用户信息""" 61 | data = self.database.read_table() # 从数据库中获取用户信息,用户信息以 username, password, created_time 形式返回 62 | for user in data: 63 | self.add_row(user[0], user[1], user[2]) 64 | 65 | def add_row(self, username, password, created_time): 66 | """在表格上添加一行新的内容""" 67 | row = self.table.rowCount() # 表格的行数 68 | self.table.setRowCount(row + 1) # 添加一行表格 69 | self.table.setItem(row, 1, QTableWidgetItem(str(username))) # 将用户信息插入到表格中 70 | self.table.setItem(row, 2, QTableWidgetItem(str(password))) 71 | self.table.setItem(row, 3, QTableWidgetItem(str(created_time))) 72 | # 设置复选框 73 | widget = QWidget() 74 | check = QCheckBox() 75 | self.check_list.append(check) # 添加到复选框列表中 76 | check_lay = QHBoxLayout() 77 | check_lay.addWidget(check) 78 | check_lay.setAlignment(Qt.AlignCenter) 79 | widget.setLayout(check_lay) 80 | self.table.setCellWidget(row, 0, widget) 81 | 82 | def add_line_edit(self): 83 | self.username_edit = QLineEdit(self) 84 | self.username_edit.setFixedSize(240, 40) 85 | self.username_edit.move(760, 700) 86 | self.username_edit.setPlaceholderText('username') 87 | 88 | self.password_edit = QLineEdit(self) 89 | self.password_edit.setFixedSize(240, 40) 90 | self.password_edit.move(760, 760) 91 | self.password_edit.setPlaceholderText('password') 92 | self.password_edit.setEchoMode(QLineEdit.Password) 93 | 94 | # 更新密码的输入框 95 | self.update_username_edit = QLineEdit(self) 96 | self.update_username_edit.setFixedSize(240, 40) 97 | self.update_username_edit.move(160, 700) 98 | self.update_username_edit.setPlaceholderText('username') 99 | 100 | self.update_password_edit = QLineEdit(self) 101 | self.update_password_edit.setFixedSize(240, 40) 102 | self.update_password_edit.move(160, 760) 103 | self.update_password_edit.setPlaceholderText('new password') 104 | 105 | def show_password(self): 106 | if self.show_password_flag: # 如果是真,隐藏密码 107 | self.password_edit.setEchoMode(QLineEdit.Password) 108 | self.show_password_flag = False 109 | self.show_password_button.setText('Show') 110 | else: # 否则显示密码 111 | self.password_edit.setEchoMode(QLineEdit.Normal) 112 | self.show_password_flag = True 113 | self.show_password_button.setText("Hide") 114 | 115 | def add_label(self): 116 | """添加界面上的标签控件""" 117 | self.username_label = QLabel(self) 118 | self.username_label.setFixedSize(160, 40) 119 | self.username_label.move(640, 700) 120 | self.username_label.setText('username') 121 | 122 | self.password_label = QLabel(self) 123 | self.password_label.setFixedSize(160, 40) 124 | self.password_label.move(640, 760) 125 | self.password_label.setText('password') 126 | 127 | # 更新密码的标签 128 | self.update_username_label = QLabel(self) 129 | self.update_username_label.setFixedSize(160, 40) 130 | self.update_username_label.move(40, 700) 131 | self.update_username_label.setText('username') 132 | 133 | self.update_password_label = QLabel(self) 134 | self.update_password_label.setFixedSize(160, 40) 135 | self.update_password_label.move(40, 760) 136 | self.update_password_label.setText('password') 137 | 138 | def add_button(self): 139 | """添加界面上的按钮控件""" 140 | # 创建按钮对象 141 | self.delete_button = QPushButton(self) 142 | self.update_button = QPushButton(self) 143 | self.add_button_ = QPushButton(self) 144 | self.show_password_button = QPushButton(self) 145 | self.clear_button = QPushButton(self) 146 | self.select_all_button = QPushButton(self) 147 | self.refresh_button = QPushButton(self) 148 | self.main_window_button = QPushButton(self) 149 | 150 | # 设置按钮上的文本 151 | self.delete_button.setText("Delete") 152 | self.update_button.setText("Update") 153 | self.add_button_.setText("Add") 154 | self.show_password_button.setText("Show") 155 | self.clear_button.setText("Clear") 156 | self.select_all_button.setText("Select All") 157 | self.refresh_button.setText("Refresh") 158 | self.main_window_button.setText("Main window") 159 | 160 | # 在按钮上设置提示信息 161 | self.delete_button.setToolTip("Delete the selected user, you can choose multiple users") 162 | self.clear_button.setToolTip("Clear all the users, including the super user, but the super user will be " 163 | "created later by default") 164 | self.select_all_button.setToolTip("Select all the users, including the super user") 165 | self.show_password_button.setToolTip("Show or hide the password") 166 | self.add_button_.setToolTip("Add a new user with the username and password in the input box") 167 | self.update_button.setToolTip("Update the password with the chosen username") 168 | self.refresh_button.setToolTip("Click here to refresh the table") 169 | self.main_window_button.setToolTip("Click here and you will go to the user interface") 170 | 171 | # 控制位置 172 | self.delete_button.move(1040, 340) 173 | self.select_all_button.move(1040, 280) 174 | self.clear_button.move(1040, 400) 175 | self.refresh_button.move(1040, 460) 176 | 177 | self.update_button.move(430, 700) 178 | self.add_button_.move(1020, 700) 179 | self.show_password_button.move(1020, 750) 180 | 181 | self.main_window_button.move(500,820) 182 | 183 | # 绑定事件 184 | self.delete_button.clicked.connect(self.delete_user) 185 | self.select_all_button.clicked.connect(self.select_all) 186 | self.clear_button.clicked.connect(self.clear) 187 | self.show_password_button.clicked.connect(self.show_password) 188 | self.add_button_.clicked.connect(self.add_user) 189 | self.update_button.clicked.connect(self.update_password) 190 | self.refresh_button.clicked.connect(self.refresh) 191 | self.main_window_button.clicked.connect(self.show_main_window) 192 | 193 | self.main_window_button.setFixedSize(200, 40) 194 | 195 | def show_main_window(self): 196 | self.main_window.show() 197 | 198 | def delete_user(self): 199 | choose_list = [] 200 | for i in self.check_list: 201 | if i.isChecked(): 202 | username = self.table.item(self.check_list.index(i), 1).text() 203 | if username == 'admin': 204 | answer = QMessageBox.critical(self, 'Error', 'You are going to delete the super user, but it will be created later with the default password', 205 | QMessageBox.Yes | QMessageBox.Cancel, QMessageBox.Cancel) 206 | if answer == QMessageBox.Yes: 207 | choose_list.append(i) 208 | if answer == QMessageBox.Cancel: 209 | return 210 | else: 211 | choose_list.append(i) 212 | 213 | for i in choose_list: 214 | username = self.table.item(self.check_list.index(i), 1).text() 215 | self.database.delete_table_by_username(username) 216 | self.table.removeRow(self.check_list.index(i)) 217 | self.check_list.remove(i) 218 | self.database.create_table() 219 | 220 | def select_all(self): 221 | """选择是否选择全部""" 222 | try: 223 | if not self.select_all_flag: 224 | for check in self.check_list: 225 | check.setCheckState(2) # 设置为选择状态 226 | self.select_all_button.setText("Unselect") 227 | self.select_all_flag = True 228 | else: 229 | for check in self.check_list: 230 | check.setCheckState(0) # 设置为未选状态 231 | self.select_all_button.setText("Select All") 232 | self.select_all_flag = False 233 | except: 234 | # 该错误是由于没有复选框引起 235 | pass 236 | 237 | def add_user(self): 238 | """一行一行的添加数据""" 239 | username = self.username_edit.text() 240 | password = self.password_edit.text() 241 | if all((username, password)): 242 | flag = self.database.insert_table(username, password) 243 | if flag: 244 | QMessageBox.critical(self, 'Error', 'Already exists the username {}, please use another username'.format(username)) 245 | else: 246 | self.add_row(username, password, self.database.get_time()) 247 | self.username_edit.setText('') # 清空输入的用户信息 248 | self.password_edit.setText('') 249 | else: 250 | QMessageBox.critical(self, 'Error', "Please fill in the blanks") 251 | 252 | def clear(self): 253 | """清空所有的数据,包括数据库和表格中的数据""" 254 | self.table.clearContents() # 清空表格的内容 255 | self.table.setRowCount(0) # 将表格的行数重置为0 256 | self.database.clear() # 清空数据库数据 257 | 258 | def update_password(self): 259 | """更新密码""" 260 | username = self.update_username_edit.text() 261 | password = self.update_password_edit.text() 262 | if len(password) >= 6: 263 | self.database.update_table(username, password) 264 | self.change_table(username, password) 265 | self.update_password_edit.setText('') 266 | self.update_username_edit.setText('') 267 | else: 268 | QMessageBox.information(self, 'Error', 'Password is too short, at least 6 words', QMessageBox.Yes, QMessageBox.Yes) 269 | 270 | def change_table(self, username, password): 271 | """更新表格""" 272 | find_flag = False 273 | for row in range(self.table.rowCount()): 274 | username_find = self.table.item(row, 1).text() 275 | if username_find == username: 276 | self.table.item(row, 2).setText(password) 277 | find_flag = True 278 | break 279 | if not find_flag: # 如果没有找到对应的用户名 280 | QMessageBox.information(self, 'prompt', 'Can not find the username {}'.format(username)) 281 | 282 | def refresh(self): 283 | """重新加载数据库并显示""" 284 | self.table.clearContents() 285 | self.check_list.clear() 286 | self.table.setRowCount(0) 287 | self.database.create_table() 288 | self.get_all_user() 289 | 290 | 291 | if __name__ == '__main__': 292 | app = QApplication(sys.argv) 293 | 294 | admin = AdminWindow() 295 | admin.show() 296 | sys.exit(app.exec_()) 297 | -------------------------------------------------------------------------------- /PyQt登录界面/Database.py: -------------------------------------------------------------------------------- 1 | # -*- coding=utf-8 -*- 2 | """ 3 | Author: Edgar 4 | Version: 1.0.0 5 | Create time: 2019 12 6 | Function: 该模块为数据库模块,主要的功能是为其他库提供数据库的更简易操作的接口 7 | """ 8 | import sqlite3 9 | import time 10 | 11 | 12 | class Database: 13 | """为登录界面所提供数据库操作的类""" 14 | 15 | def __init__(self, db): 16 | self._database = db 17 | self.create_table() 18 | 19 | @property 20 | def database(self): 21 | return self._database 22 | 23 | @database.setter 24 | def database(self, db): 25 | self._database = db 26 | 27 | def create_table(self): 28 | """创建一个数据库""" 29 | connect = sqlite3.connect(self._database) 30 | cursor = connect.cursor() 31 | sql = "CREATE TABLE IF NOT EXISTS data(username TEXT, password TEXT, created_time TEXT)" 32 | cursor.execute(sql) 33 | if not self.is_has('admin'): # 管理员的用户名一定为 admin ! 34 | created_time = self.get_time() 35 | default = "INSERT INTO data(username, password, created_time) VALUES('admin', 'admin123', ?)" # 设置初始的账号密码 36 | cursor.execute(default, (created_time,)) 37 | connect.commit() 38 | connect.close() 39 | 40 | def insert_table(self, username, password): 41 | """向数据库中插入元素""" 42 | connect = sqlite3.connect(self._database) 43 | cursor = connect.cursor() 44 | if self.is_has(username): 45 | # print("Already exits username {}".format(username)) # 测试使用 46 | return True # 已经有该元素的时候返回一个 True 提供外界接口 47 | else: 48 | created_time = self.get_time() 49 | sql = 'INSERT INTO data (username, password, created_time) VALUES(?,?,?)' 50 | cursor.execute(sql, (username, password, created_time)) 51 | connect.commit() 52 | connect.close() 53 | 54 | def read_table(self): 55 | """读取数据库中的所有元素""" 56 | connect = sqlite3.connect(self._database) 57 | cursor = connect.cursor() 58 | sql = 'SELECT * FROM data ORDER BY username' 59 | result = cursor.execute(sql) 60 | data = result.fetchall() 61 | connect.commit() 62 | connect.close() 63 | return data 64 | 65 | def update_table(self, username, password): 66 | """更新数据库中的数据""" 67 | connect = sqlite3.connect(self._database) 68 | cursor = connect.cursor() 69 | sql = 'UPDATE data SET password =? WHERE username=? ' 70 | cursor.execute(sql, (password, username)) 71 | connect.commit() 72 | connect.close() 73 | 74 | def find_password_by_username(self, username): 75 | """根据用户名来查找用户的密码""" 76 | connect = sqlite3.connect(self._database) 77 | cursor = connect.cursor() 78 | sql = 'SELECT password FROM data WHERE username=?' 79 | result = cursor.execute(sql, (username,)) 80 | connect.commit() 81 | found_data = result.fetchall() 82 | connect.close() 83 | return found_data 84 | 85 | def delete_table_by_username(self, username): 86 | """通过用户名称删除数据""" 87 | connect = sqlite3.connect(self._database) 88 | cursor = connect.cursor() 89 | sql = 'DELETE FROM data WHERE username=?' 90 | cursor.execute(sql, (username,)) 91 | connect.commit() 92 | connect.close() 93 | 94 | def is_has(self, username): 95 | """判断数据库中是否包含用户名信息""" 96 | connect = sqlite3.connect(self._database) 97 | cursor = connect.cursor() 98 | sql = 'SELECT * FROM data WHERE username=?' 99 | result = cursor.execute(sql, (username,)) 100 | connect.commit() 101 | all_data = result.fetchall() 102 | connect.close() 103 | if all_data: 104 | return True 105 | else: 106 | return False 107 | 108 | def clear(self): 109 | """清空所有的数据""" 110 | connect = sqlite3.connect(self._database) 111 | cursor = connect.cursor() 112 | sql = "DELETE FROM data" 113 | cursor.execute(sql) 114 | connect.commit() 115 | connect.close() 116 | 117 | @staticmethod 118 | def get_time(): 119 | date = time.localtime() 120 | created_time = "{}-{}-{}-{}:{}:{}".format(date.tm_year, date.tm_mon, 121 | date.tm_mday, 122 | date.tm_hour, date.tm_min, 123 | date.tm_sec) 124 | return created_time 125 | 126 | 127 | if __name__ == '__main__': 128 | data = Database('./data.db') 129 | # data.insert_table('admin', 'password') 130 | data_ = data.read_table() 131 | print(data_) 132 | # for i in range(23): # 简单的创建用户 133 | # data.insert_table(chr(i + 65) * 5, chr(i + 65) + chr(i + 66) * 5) 134 | -------------------------------------------------------------------------------- /PyQt登录界面/IMG/display.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/display.gif -------------------------------------------------------------------------------- /PyQt登录界面/IMG/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/flow.png -------------------------------------------------------------------------------- /PyQt登录界面/IMG/logic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/logic.png -------------------------------------------------------------------------------- /PyQt登录界面/IMG/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/python-logo.png -------------------------------------------------------------------------------- /PyQt登录界面/IMG/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/python.png -------------------------------------------------------------------------------- /PyQt登录界面/IMG/welcome.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/IMG/welcome.jpg -------------------------------------------------------------------------------- /PyQt登录界面/Login.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | Author: Edgar 4 | Version: 1.0.0 5 | Create time: 2019 11 6 | Modified time: 2019 12-10 7 | Function: 该模块控制登录事件,同时也是各个模块的集合 8 | """ 9 | import os 10 | import sys 11 | from Sign_Up import SignWindow # 注册所需要的自定义库 12 | from Admin import AdminWindow 13 | from Database import Database 14 | from Main import Main 15 | 16 | try: 17 | import PyQt5 18 | except ModuleNotFoundError: 19 | os.system("pip install PyQt5") 20 | from PyQt5.Qt import * 21 | else: 22 | from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QFrame, QMessageBox, QComboBox 23 | from PyQt5.QtGui import QIcon, QFont 24 | from PyQt5.QtCore import Qt 25 | 26 | 27 | class MyWindow(QWidget): 28 | def __init__(self): 29 | super().__init__() 30 | self.icon = QIcon("./IMG/python-logo.png") 31 | self.database = Database('./data.db') 32 | self.sign_up_win = SignWindow() # 创建的注册窗口 33 | self.admin_win = AdminWindow() # 创建的用户管理窗口 34 | self.main_win = Main() # 登录后的主页面 35 | self.admin_win.set_main_window(self.main_win) 36 | self.setWindowTitle(" Login in") 37 | self.setFixedSize(1000, 800) 38 | self.set_ui() 39 | 40 | def change_icon(self): 41 | """用来修改图像的图标""" 42 | self.setWindowIcon(self.icon) 43 | 44 | def set_ui(self): 45 | """设置界面""" 46 | self.set_background_image() # 设置背景的图片 47 | self.change_icon() 48 | self.add_label() 49 | self.add_line_edit() 50 | self.add_button() 51 | 52 | def add_label(self): 53 | """添加相应的标签""" 54 | # 设置字体 55 | label_font = QFont() 56 | label_font.setFamily('Consolas') 57 | label_font.setPixelSize(30) 58 | 59 | # 创建文本标签 60 | self.username_label = QLabel(self) 61 | self.password_label = QLabel(self) 62 | 63 | # 设置标签中的文本 64 | self.username_label.setText("username") 65 | self.password_label.setText("password") 66 | 67 | # 设置标签的大小 68 | self.username_label.setFixedSize(240, 40) 69 | self.password_label.setFixedSize(240, 40) 70 | 71 | # 设置标签的位置 72 | self.username_label.move(120, 530) 73 | self.password_label.move(120, 600) 74 | 75 | self.username_label.setFont(label_font) 76 | self.password_label.setFont(label_font) 77 | 78 | def add_line_edit(self): 79 | """添加输入框""" 80 | line_edit_font = QFont() 81 | line_edit_font.setFamily('Consolas') 82 | line_edit_font.setPixelSize(30) 83 | 84 | # 创建 85 | self.username_edit = QLineEdit(self) 86 | self.password_edit = QLineEdit(self) 87 | 88 | # 设置密码格式 89 | self.password_edit.setEchoMode(QLineEdit.Password) 90 | 91 | # 设置字体 92 | self.username_edit.setFont(line_edit_font) 93 | self.password_edit.setFont(line_edit_font) 94 | 95 | # 设置占位符 96 | self.username_edit.setPlaceholderText("username") 97 | self.password_edit.setPlaceholderText("password") 98 | 99 | # 设置大小 100 | self.username_edit.setFixedSize(350, 40) 101 | self.password_edit.setFixedSize(350, 40) 102 | 103 | # 设置位置 104 | self.username_edit.move(320, 530) 105 | self.password_edit.move(320, 600) 106 | 107 | def add_button(self): 108 | """添加按钮""" 109 | button_font = QFont() 110 | button_font.setFamily('Consolas') 111 | button_font.setPixelSize(30) 112 | 113 | # 创建按钮对象 114 | self.login_button = QPushButton("Login", self) 115 | self.sign_button = QPushButton(self) 116 | 117 | # 修改大小且不可变 118 | self.login_button.setFixedSize(160, 50) 119 | self.sign_button.setFixedSize(160, 50) 120 | 121 | # 设置字体 122 | self.login_button.setFont(button_font) 123 | self.sign_button.setFont(button_font) 124 | 125 | # 设置位置 126 | self.login_button.move(750, 530) 127 | self.sign_button.move(750, 600) 128 | 129 | # 设置文本提示内容 130 | self.login_button.setText("Login in") 131 | self.sign_button.setText("Sign up") 132 | self.login_button.setToolTip('If you are the admin, please login in with the specific account') 133 | 134 | # 实现功能,按钮点击之后执行的动作 135 | self.login_button.clicked.connect(self.login) 136 | self.sign_button.clicked.connect(self.sign_up_window) 137 | 138 | self.login_button.setShortcut("Return") # 设置快捷键 139 | 140 | def set_background_image(self): 141 | """添加背景图片""" 142 | self.frame = QFrame(self) # 这里采用 QFrame, 如果直接对self进行背景设置,似乎没有那么简单容易控制 143 | self.frame.resize(1000, 520) 144 | self.frame.move(40, 150) 145 | self.frame.setStyleSheet( 146 | 'background-image: url("./IMG/python.png"); background-repeat: no-repeat; text-align:center;') 147 | 148 | def login(self): 149 | """登录功能实现""" 150 | username = self.username_edit.text() 151 | password = self.password_edit.text() 152 | data = self.database.find_password_by_username(username) # 在数据库中查找数据 153 | if username and password: # 如果两个输入框都不为空 154 | if data: 155 | if str(data[0][0]) == password: 156 | QMessageBox.information(self, 'Successfully', 'Login in successful \n Welcome {}'.format(username), 157 | QMessageBox.Yes | QMessageBox.No) 158 | self.password_edit.setText('') # 登录成功,将之前的用户信息清除 159 | self.username_edit.setText('') 160 | self.close() 161 | if username == 'admin': # 如果是管理员,进入管理界面 162 | self.admin_win.show() 163 | else: 164 | self.main_win.show() 165 | 166 | else: 167 | QMessageBox.information(self, 'Failed', 'Password is wrong, try again', 168 | QMessageBox.Yes | QMessageBox.No) 169 | else: 170 | QMessageBox.information(self, 'Error', 'No such username', QMessageBox.Yes | QMessageBox.No) 171 | elif username: # 如果用户名写了 172 | QMessageBox.information(self, 'Error', 'Input your password', QMessageBox.Yes | QMessageBox.No) 173 | else: 174 | QMessageBox.information(self, 'Error', 'Fill in the blank', QMessageBox.Yes | QMessageBox.No) 175 | 176 | def sign_up_window(self): 177 | self.sign_up_win.setWindowIcon(self.icon) 178 | self.sign_up_win.move(self.x() + 100, self.y() + 100) # 移动一下注册窗口,以免和之前的重复 179 | frame = QFrame(self.sign_up_win) 180 | self.sign_up_win.setWindowFlag(Qt.Dialog) 181 | frame.resize(1000, 300) 182 | frame.setStyleSheet('background-image: url("./IMG/python.png"); background-repeat: no-repeat;') 183 | frame.move(40, 150) 184 | # 打开注册窗口时,清除原来的信息 185 | self.password_edit.setText('') 186 | self.username_edit.setText('') 187 | self.sign_up_win.show() 188 | 189 | def closeEvent(self, event): 190 | self.sign_up_win.close() # 关闭登录窗口的时候,注册窗口也应该关闭 191 | 192 | 193 | if __name__ == '__main__': 194 | app = QApplication(sys.argv) 195 | window = MyWindow() 196 | window.show() 197 | 198 | sys.exit(app.exec_()) 199 | -------------------------------------------------------------------------------- /PyQt登录界面/Main.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | Author: Edgar 4 | Version: 1.0.0 5 | Create time: 2019 12 6 | Function: 主页面 7 | """ 8 | import sys 9 | from PyQt5.QtWidgets import QApplication, QMainWindow 10 | from PyQt5.QtGui import QIcon, QFont 11 | 12 | 13 | class Main(QMainWindow): 14 | def __init__(self): 15 | super().__init__() 16 | self.set_ui() 17 | 18 | def set_ui(self): 19 | self.setWindowTitle('Main page') 20 | self.setWindowIcon(QIcon('./IMG/python-logo.png')) 21 | self.setFixedSize(1200, 900) 22 | self.setFont(QFont('Consolas')) 23 | self.setStyleSheet("background-image: url('./IMG/welcome.jpg'); background-repeat: no repeat") 24 | # self.setWindowOpacity(0.9) 25 | 26 | 27 | if __name__ == '__main__': 28 | app = QApplication(sys.argv) 29 | window = Main() 30 | window.show() 31 | sys.exit(app.exec_()) 32 | -------------------------------------------------------------------------------- /PyQt登录界面/README.md: -------------------------------------------------------------------------------- 1 | ## 用户登录和注册界面 2 | 3 | ##### 一. 声明 4 | 5 | 1. 该界面设计为`上海交通大学程序设计思想与方法`,教学班`(2019-2020-1)-CS902-3`所制作的课程大作业 6 | 2. 之所以选择制作该`GUI用户界面`的原因是学习`tkinter`之后发现其用作界面设计有许多不足之处,并于前段时间学习过部分`PyQt`知识,便用此为实践 7 | 8 |
9 | 10 | ##### 二. 使用说明 11 | 12 | 1. 界面逻辑 13 | 14 | img1 15 | 16 | 17 | 18 | 19 | 2. 该GUI界面的主要用于应用程序的登录和注册,并用数据库`sqlite3`保存用户的信息,但只是保存在本地 20 | 21 | 3. 该GUI界面使用十分简单,与平常的网页版注册登录没有太多区别,另外有管理员的管理界面,可用于对所有用户的相关操作 22 | 23 | 4. 本GUI界面应该在**Python3**环境下运行,python2似乎`不支持`PyQt,本人在`PyCharm 2019.2.5 + Anaconda3 `环境下可以成功运行 24 | 25 | 5. 下面为部分功能演示gif,图片并不是很清晰,可自行运行测试效果 26 | 27 | 演示gif 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 | ##### 三. 模块说明 36 | 37 | img2 38 | 39 | 40 | 1. Login.py 41 | 42 | 该模块主要负责用户的登录,以及与其他窗口的联系,使用时应该注意安装`PyQt5`模块,如果没有安装则会调用`os`模块使用`pip`进行安装,若安装失败,则无法进行下一步,但是还是建议自己先配置好pyqt5的环境 43 | 44 | 45 | 46 | 2. Sign_Up.py 47 | 48 | 该模块主要负责用户的注册,注册时候必须两次输入的密码相同并且用户名不存在方可成功注册,否则提示用户名已经存在,并要求重新填写,注册完成之后,窗口关闭,返回之前的登录窗口 49 | 50 | 51 | 52 | 3. Admin.py 53 | 54 | 该模块负责管理员对所有用户的操作,包括删除,修改密码,添加用户等, 55 | 56 | 删除用户的时候,需要选择前面的选择框,然后点击`Delete`, `Select All`可方便一次性选择全部,点击之后变为`Unselect`,可用于不选择任何用户,`Clear`可一次性删除全部,包括`admin`,但是之后仍会自动生成`admin`并设置好默认密码,`Refresh`可以更新表格,将数据库中的数据重新添加到表格中,`Update`必须对应已有的用户名,否则报错提示,`Add`可以实现添加用户,但必须是数据库中没有的用户,`Show`可以用于添加用户时的密码框文本是否显式显示出来,点击之后变为`Hide` 57 | 58 | 59 | 60 | 4. Database.py 61 | 62 | 为操作数据库提供接口,可实现插入数据,获取数据,以用户名查找密码,以用户名更新密码,以用户名删除数据,清空数据库等功能 63 | 64 | 65 | 66 | 5. Main.py 67 | 68 | 该模块为用户登录后所看到的界面,可由自己自定义设置,在这里并没有过多的设置,只是展现一个图像,表示登录完成 69 | 70 | 71 | ##### 四、不足之处 72 | - 由于时间问题,主界面并没有进行相关的设置,显得比较简陋 73 | - 部分代码显得有点冗余,可以进行更细致的模块化,减少代码量 74 | - 囿于能力问题,总体界面非动态,并且设置了不可改变的大小 75 | - ...... 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /PyQt登录界面/Sign_Up.py: -------------------------------------------------------------------------------- 1 | # -*- coding=utf-8 -*- 2 | """ 3 | Author: Edgar 4 | Version: 1.0.0 5 | Create time: 2019 11 6 | Modified time: 2019 12-10 7 | Function: 该模块控制注册事件 8 | """ 9 | from PyQt5.QtWidgets import QLabel, QLineEdit, QWidget, QPushButton, \ 10 | QMessageBox, QApplication 11 | from PyQt5.QtGui import QFont 12 | from Database import Database 13 | import sys 14 | 15 | 16 | class SignWindow(QWidget): 17 | def __init__(self): 18 | super(SignWindow, self).__init__() 19 | self.database = Database('./data.db') 20 | self.setWindowTitle("Sign up") # 设置标题 21 | self.resize(1000, 800) # 设置窗口的大小 22 | self.set_ui() # 调用其他的设计方法 23 | 24 | def set_ui(self): # 集合所有的设计 25 | self.add_line_edit() 26 | self.add_button() 27 | self.add_label() 28 | 29 | def add_label(self): 30 | """添加相应的标签""" 31 | # 设置文本的字体 32 | label_font = QFont() 33 | label_font.setFamily('Consolas') 34 | label_font.setPixelSize(35) 35 | 36 | # 创建三个对应的标签,父窗口为 self 37 | self.username_label = QLabel(self) 38 | self.password_label = QLabel(self) 39 | self.confirm_label = QLabel(self) 40 | 41 | # 相应的标签设置文本 42 | self.username_label.setText("username") 43 | self.password_label.setText("password") 44 | self.confirm_label.setText("confirmed") 45 | 46 | # 控制label的大小 fixedSize表示之后无法修改 47 | self.username_label.setFixedSize(240, 40) 48 | self.password_label.setFixedSize(240, 40) 49 | self.confirm_label.setFixedSize(240, 40) 50 | 51 | # 设置对应的位置,注意move不是移动多少,而是直接移动到 52 | self.username_label.move(120, 530) 53 | self.password_label.move(120, 600) 54 | self.confirm_label.move(120, 670) 55 | 56 | # 设置字体 57 | self.username_label.setFont(label_font) 58 | self.password_label.setFont(label_font) 59 | self.confirm_label.setFont(label_font) 60 | 61 | def add_line_edit(self): 62 | """添加输入框""" 63 | line_edit_font = QFont() 64 | line_edit_font.setFamily('Consolas') 65 | line_edit_font.setPixelSize(30) 66 | 67 | # 创建三个输入框,父窗口为 self 68 | self.username_edit = QLineEdit(self) 69 | self.password_edit = QLineEdit(self) 70 | self.confirm_edit = QLineEdit(self) 71 | 72 | # 设置密码格式,输入密码的时候不可见密码 73 | self.password_edit.setEchoMode(QLineEdit.Password) 74 | self.confirm_edit.setEchoMode(QLineEdit.Password) 75 | 76 | # 设置一下字体 77 | self.username_edit.setFont(line_edit_font) 78 | self.password_edit.setFont(line_edit_font) 79 | self.confirm_edit.setFont(line_edit_font) 80 | 81 | # 设置输入框中的占位符 82 | self.username_edit.setPlaceholderText("username") 83 | self.password_edit.setPlaceholderText("password") 84 | self.confirm_edit.setPlaceholderText('password again') 85 | 86 | # 控制大小 87 | self.username_edit.setFixedSize(350, 40) 88 | self.password_edit.setFixedSize(350, 40) 89 | self.confirm_edit.setFixedSize(350, 40) 90 | 91 | # 控制位置 92 | self.username_edit.move(320, 530) 93 | self.password_edit.move(320, 600) 94 | self.confirm_edit.move(320, 670) 95 | 96 | def add_button(self): 97 | """添加按钮""" 98 | button_font = QFont() 99 | button_font.setFamily('Consolas') 100 | button_font.setPixelSize(30) 101 | 102 | self.sign_button = QPushButton(self) 103 | self.sign_button.setFixedSize(160, 50) 104 | self.sign_button.setFont(button_font) 105 | self.sign_button.move(750, 600) 106 | self.sign_button.setText("Sign up") 107 | 108 | self.sign_button.setShortcut('Return') 109 | 110 | self.sign_button.clicked.connect(self.sign_up) 111 | 112 | def sign_up(self): 113 | """实现注册功能""" 114 | username = self.username_edit.text() 115 | password = self.password_edit.text() 116 | confirm = self.confirm_edit.text() 117 | 118 | if not password or not confirm: # 如果有一个密码或者密码确认框为空 119 | QMessageBox.information(self, 'Error', 'The password is empty', 120 | QMessageBox.Yes) 121 | elif self.database.is_has(username): # 如果用户名已经存在 122 | QMessageBox.information(self, 'Error', 123 | 'The username already exists', 124 | QMessageBox.Yes) 125 | else: 126 | if password == confirm and password: # 如果两次密码一致,并且不为空 127 | if len(username) < 5: 128 | QMessageBox.information(self, 'Error', 129 | 'The username is too short, change it for a long one, at least 5 words', 130 | QMessageBox.Yes, QMessageBox.Yes) 131 | return 132 | if len(password) < 6: 133 | QMessageBox.information(self, 'Error', 134 | 'You password\'s length is less than 6, please input again', 135 | QMessageBox.Yes) 136 | return 137 | else: 138 | self.database.insert_table(username, password) # 将用户信息写入数据库 139 | QMessageBox.information(self, 'Successfully', 140 | 'Sign up successfully'.format( 141 | username), 142 | QMessageBox.Yes) 143 | self.close() # 注册完毕之后关闭窗口 144 | else: 145 | QMessageBox.information(self, 'Error', 146 | 'The password is not equal', 147 | QMessageBox.Yes) 148 | 149 | def closeEvent(self, event): 150 | """关闭之后将输入框清空""" 151 | self.username_edit.setText('') 152 | self.confirm_edit.setText('') 153 | self.password_edit.setText('') 154 | 155 | 156 | if __name__ == '__main__': 157 | app = QApplication(sys.argv) 158 | window = SignWindow() 159 | window.show() 160 | 161 | sys.exit(app.exec_()) 162 | -------------------------------------------------------------------------------- /PyQt登录界面/__pycache__/Admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/__pycache__/Admin.cpython-37.pyc -------------------------------------------------------------------------------- /PyQt登录界面/__pycache__/Database.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/__pycache__/Database.cpython-37.pyc -------------------------------------------------------------------------------- /PyQt登录界面/__pycache__/Login.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/__pycache__/Login.cpython-37.pyc -------------------------------------------------------------------------------- /PyQt登录界面/__pycache__/Main.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/__pycache__/Main.cpython-37.pyc -------------------------------------------------------------------------------- /PyQt登录界面/__pycache__/Sign_Up.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/__pycache__/Sign_Up.cpython-37.pyc -------------------------------------------------------------------------------- /PyQt登录界面/data.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhaideng/PyQt/e78c0d01318690de280960cec6bc40858a5d9254/PyQt登录界面/data.db --------------------------------------------------------------------------------