└── 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 |
12 |
13 |
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 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/PyQt登录界面/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
53 |
54 |
55 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 | 1575453317036
220 |
221 |
222 | 1575453317036
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
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 |
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 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | ##### 三. 模块说明
36 |
37 |
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
--------------------------------------------------------------------------------