问卷调查系统的实现

这是我的一个python程序设计课程中的题,经过一天半的努力,敲了563行代码,我终于实现了这个功能,同时呢我也会将这个系统的经验分享给大家。首先来看我们的要求:
项目目标:
开发一个在线调查问卷系统,允许用户创建、发布和管理问卷,同时允许其他用户填写问卷并收集结果。

功能需求:
用户注册与管理:用户可以注册账户并进行个人信息管理。
问卷创建:用户可以创建问卷,包括问题和选项。
问卷编辑与删除:用户可以编辑或删除自己的问卷。
问卷发布:用户可以将问卷发布到指定平台或生成分享链接。
问卷填写:其他用户可以填写问卷并提交答案。
结果收集与分析:系统自动收集问卷结果并提供基本的统计分析。
结果可视化:通过图表展示问卷结果。
数据导出:允许用户将问卷结果导出为CSV或Excel格式。
分工:
1. 项目经理(PM)
负责整体项目规划、时间管理、团队沟通和协调。
确保项目按时完成,解决团队成员遇到的问题。
2. 前端开发者(Frontend Developer)
设计和实现应用程序的用户界面,包括注册页面、问卷创建和管理界面、问卷填写界面。
使用HTML、CSS和JavaScript(可能使用框架如React或Vue.js)实现界面设计。
3. 后端开发者(Backend Developer)
负责实现业务逻辑,包括用户认证、问卷数据的增删改查等。
使用Python编写后端逻辑,可能使用Flask或Django等框架。
4. 数据库管理员(DBA)
设计数据库模型,包括用户表、问卷表、问题表、答案表等。
实现数据库的增删改查操作,确保数据的一致性和完整性。
5. 功能开发者(Feature Developer)
实现特定功能,如问卷发布、结果收集与分析、数据导出等。
与后端开发者协作,确保功能的实现与后端逻辑的一致性。
6. 数据可视化工程师(Data Visualization Developer)
负责问卷结果的可视化展示,集成图表库,如D3.js或Chart.js。
7. 测试工程师(Tester)
设计测试用例,确保所有功能的正确性和用户界面的友好性。
执行测试,记录并报告发现的问题。
协助开发团队修复发现的问题。
8. 文档编写者(Documentation Writer)
编写用户手册和系统文档,包括使用说明、系统架构等。
确保文档的准确性和易读性。
项目时间线(一周):
第1天:
项目启动会议,分配任务。
前端开发者开始设计用户界面草图。
项目经理制定详细的项目计划和时间表。
第2天:
前端开发者完成界面设计草图,开始实现界面。
后端开发者和数据库管理员讨论数据库设计和后端逻辑。
第3天:
数据库管理员完成数据库设计,开始实现数据库操作。
功能开发者开始实现特定功能模块。
第4天:
后端开发者实现业务逻辑,与前端开发者协作进行接口对接。
数据可视化工程师开始实现结果可视化功能。
第5天:
所有开发工作基本完成,测试工程师开始设计测试用例。
测试工程师执行测试,记录问题。
第6天:
修复测试中发现的问题。
进行第二轮测试,确保所有功能正常工作。
文档编写者完成文档编写。
准备项目演示材料。
项目经理组织项目总结会议,收集反馈。
注意事项:
项目经理需要密切关注项目进度,确保按计划进行。
开发者之间需要进行有效沟通,确保功能的协调和一致性。
测试工程师需要全面测试每个功能,确保没有遗漏。
文档编写者需要与开发团队紧密合作,确保文档的准确性。
通过这样的分工,每个团队成员都有明确的任务和责任,有助于确保项目按时完成,并且每个人的工作量相对均衡。

在这个系统中,我们需要实现登录注册功能,创建问卷功能,收集问卷问题和答案功能,回答问卷功能,收集回答问卷功能,实现数据库连接以及数据可视化页面。相关代码如下:

from tkinter import *
import csv
import tkinter as tk
from tkinter import messagebox
import pymysql
import matplotlib.pyplot as plt
conn=pymysql.connect(
    host="localhost",
    user="root",
    password="778899",
    database="student",
)
cursor = conn.cursor()
ID=10
COUNT=0
# # _________________________________________________________________
cursor.execute("DROP TABLE IF EXISTS python1")
sql = """CREATE TABLE `python1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `问题` varchar(20) NOT NULL,
  `A` varchar(20) NOT NULL,
  `B` varchar(20) NOT NULL,
  `C` varchar(20) NOT NULL,
  `D` varchar(20) NOT NULL,
  PRIMARY KEY (`id`))
  ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb3"""#调用cursor的execute()方法执行上述sql语句,创建student_info表
cursor.execute(sql)
conn.commit()
cursor.execute("DROP TABLE IF EXISTS python2")
sql = """CREATE TABLE `python2` (
              `id` int NOT NULL AUTO_INCREMENT,
              `第一问` varchar(20) NOT NULL,
              `第二问` varchar(20) NOT NULL,
              `第三问` varchar(20) NOT NULL,
              PRIMARY KEY (`id`))
              ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb3"""  # 调用cursor的execute()方法执行上述sql语句,创建student_info表
cursor.execute(sql)
conn.commit()

# _________________________________________________________________
# 异常时rollback()操作#插入单条记录,使用sql字符串
# sql = """insert into python1(id,问题,A,B,C,D)
# values (4,'你今天吃的什么','大米','小米','肉','菜')"""
# try:
#     insert = cursor.execute(sql)
#     conn.commit()               		#提交数据库执行
#     print("insert = ",insert)
# except:
#     conn.rollback()
users = {}
class Create:
    def _init_(self):
        self.win2 = tk.Tk()
        self.win2.title("问卷创建页面")
        self.win2.geometry("600x600")
        self.create_label1 = tk.Label(win2, text="问题一:")
        self.create_label1.place(x=0, y=0, width=100, height=20)
        self.create_entry1 = tk.Entry(win2)
        self.create_entry1.place(x=150, y=0)
        self.create_1A = tk.Label(win2, text="A")
        self.create_1A.place(x=10, y=40, width=20, height=10)
        self.create_1Aentry = tk.Entry(win2)
        self.create_1Aentry.place(x=40, y=40, width=40)
        self.create_1B = tk.Label(win2, text="B")
        self.create_1B.place(x=90, y=40, width=20, height=10)
        self.create_1Bentry = tk.Entry(win2)
        self.create_1Bentry.place(x=120, y=40, width=40)
        self.create_1C = tk.Label(win2, text="C")
        self.create_1C.place(x=170, y=40, width=20, height=10)
        self.create_1Centry = tk.Entry(win2)
        self.create_1Centry.place(x=200, y=40, width=40)
        self.create_1D = tk.Label(win2, text="D")
        self.create_1D.place(x=250, y=40, width=20, height=10)
        self.create_1Dentry = tk.Entry(win2)
        self.create_1Dentry.place(x=280, y=40, width=40)

        self.create_label2 = tk.Label(win2, text="问题二:")
        self.create_label2.place(x=0, y=70, width=100, height=20)
        self.create_entry2 = tk.Entry(win2)
        self.create_entry2.place(x=150, y=70)
        self.create_2A = tk.Label(win2, text="A")
        self.create_2A.place(x=10, y=110, width=20, height=10)
        self.create_2Aentry = tk.Entry(win2)
        self.create_2Aentry.place(x=40, y=110, width=40)
        self.create_2B = tk.Label(win2, text="B")
        self.create_2B.place(x=90, y=110, width=20, height=10)
        self.create_2Bentry = tk.Entry(win2)
        self.create_2Bentry.place(x=120, y=110, width=40)
        self.create_2C = tk.Label(win2, text="C")
        self.create_2C.place(x=170, y=110, width=20, height=10)
        self.create_2Centry = tk.Entry(win2)
        self.create_2Centry.place(x=200, y=110, width=40)
        self.create_2D = tk.Label(win2, text="D")
        self.create_2D.place(x=250, y=110, width=20, height=10)
        self.create_2Dentry = tk.Entry(win2)
        self.create_2Dentry.place(x=280, y=110, width=40)

        self.create_label3 = tk.Label(win2, text="问题三:")
        self.create_label3.place(x=0, y=140, width=100, height=20)
        self.create_entry3 = tk.Entry(win2)
        self.create_entry3.place(x=150, y=140)
        self.create_3A = tk.Label(win2, text="A")
        self.create_3A.place(x=10, y=180, width=20, height=10)
        self.create_3Aentry = tk.Entry(win2)
        self.create_3Aentry.place(x=40, y=180, width=40)
        self.create_3B = tk.Label(win2, text="B")
        self.create_3B.place(x=90, y=180, width=20, height=10)
        self.create_3Bentry = tk.Entry(win2)
        self.create_3Bentry.place(x=120, y=180, width=40)
        self.create_3C = tk.Label(win2, text="C")
        self.create_3C.place(x=170, y=180, width=20, height=10)
        self.create_3Centry = tk.Entry(win2)
        self.create_3Centry.place(x=200, y=180, width=40)
        self.create_3D = tk.Label(win2, text="D")
        self.create_3D.place(x=250, y=180, width=20, height=10)
        self.create_3Dentry = tk.Entry(win2)
        self.create_3Dentry.place(x=280, y=180, width=40)
        self.creat_submit = tk.Button(win2, text='submit', command=submit1)
        self.creat_submit.place(x=250, y=400, width=100)
        # self.question_var1 = tk.StringVar(self.win2)
        # self.question_var1.place(x=0,y=90)
        # self.question_var2 = tk.StringVar(self.win2)
        # self.question_var2.place(x=0, y=90)
        # self.question_var3 = tk.StringVar(self.win2)
        # self.question_var3.place(x=0, y=90)
createdemo=Create()
def creat():
    createdemo.win2=tk.Tk()
    createdemo.win2.title("创建问卷页面")
    createdemo.win2.geometry("1000x600")
    createdemo.create_label1 = tk.Label(createdemo.win2, text="问题一:")
    createdemo.create_label1.place(x=0, y=0, width=200, height=80)
    createdemo.create_1A = tk.Label(createdemo.win2, text="A")
    createdemo.create_1A.place(x=20, y=80, width=80, height=20)
    createdemo.create_1Aentry = tk.Entry(createdemo.win2)
    createdemo.create_1Aentry.place(x=80, y=80, width=160)
    createdemo.create_1B = tk.Label(createdemo.win2, text="B")
    createdemo.create_1B.place(x=280, y=80, width=80, height=20)
    createdemo.create_1Bentry = tk.Entry(createdemo.win2)
    createdemo.create_1Bentry.place(x=340, y=80, width=160)
    createdemo.create_1C = tk.Label(createdemo.win2, text="C")
    createdemo.create_1C.place(x=540, y=80, width=80, height=20)
    createdemo.create_1Centry = tk.Entry(createdemo.win2)
    createdemo.create_1Centry.place(x=600, y=80, width=160)
    createdemo.create_1D = tk.Label(createdemo.win2, text="D")
    createdemo.create_1D.place(x=800, y=80, width=80, height=20)
    createdemo.create_1Dentry = tk.Entry(createdemo.win2)
    createdemo.create_1Dentry.place(x=860, y=80, width=160)
    createdemo.create_entry1 = tk.Entry(createdemo.win2)
    createdemo.create_entry1.place(x=180, y=20, width=820, height=40)

    createdemo.create_label2 = tk.Label(createdemo.win2, text="问题二:")
    createdemo.create_label2.place(x=0, y=100, width=200, height=80)
    createdemo.create_entry2 = tk.Entry(createdemo.win2)
    createdemo.create_entry2.place(x=180, y=120, width=820, height=40)
    createdemo.create_2A = tk.Label(createdemo.win2, text="A")
    createdemo.create_2A.place(x=20, y=180, width=80, height=20)
    createdemo.create_2Aentry = tk.Entry(createdemo.win2)
    createdemo.create_2Aentry.place(x=80, y=180, width=160)
    createdemo.create_2B = tk.Label(createdemo.win2, text="B")
    createdemo.create_2B.place(x=280, y=180, width=80, height=20)
    createdemo.create_2Bentry = tk.Entry(createdemo.win2)
    createdemo.create_2Bentry.place(x=340, y=180, width=160)
    createdemo.create_2C = tk.Label(createdemo.win2, text="C")
    createdemo.create_2C.place(x=540, y=180, width=80, height=20)
    createdemo.create_2Centry = tk.Entry(createdemo.win2)
    createdemo.create_2Centry.place(x=600, y=180, width=160)
    createdemo.create_2D = tk.Label(createdemo.win2, text="D")
    createdemo.create_2D.place(x=800, y=180, width=80, height=20)
    createdemo.create_2Dentry = tk.Entry(createdemo.win2)
    createdemo.create_2Dentry.place(x=860, y=180, width=160)

    createdemo.create_label3 = tk.Label(createdemo.win2, text="问题三:")
    createdemo.create_label3.place(x=0, y=200, width=200, height=80)
    createdemo.create_entry3 = tk.Entry(createdemo.win2)
    createdemo.create_entry3.place(x=180, y=220, width=820, height=40)
    createdemo.create_3A = tk.Label(createdemo.win2, text="A")
    createdemo.create_3A.place(x=20, y=280, width=80, height=20)
    createdemo.create_3Aentry = tk.Entry(createdemo.win2)
    createdemo.create_3Aentry.place(x=80, y=280, width=160)
    createdemo.create_3B = tk.Label(createdemo.win2, text="B")
    createdemo.create_3B.place(x=280, y=280, width=80, height=20)
    createdemo.create_3Bentry = tk.Entry(createdemo.win2)
    createdemo.create_3Bentry.place(x=340, y=280, width=160)
    createdemo.create_3C = tk.Label(createdemo.win2, text="C")
    createdemo.create_3C.place(x=540, y=280, width=80, height=20)
    createdemo.create_3Centry = tk.Entry(createdemo.win2)
    createdemo.create_3Centry.place(x=600, y=280, width=160)
    createdemo.create_3D = tk.Label(createdemo.win2, text="D")
    createdemo.create_3D.place(x=800, y=280, width=80, height=20)
    createdemo.create_3Dentry = tk.Entry(createdemo.win2)
    createdemo.create_3Dentry.place(x=860, y=280, width=160)
    createdemo.creat_submit = tk.Button(createdemo.win2, text='submit', command=submit1)
    createdemo.creat_submit.place(x=500, y=330, width=100, height=45)
    createdemo.win2.mainloop()






class Answer:
    def _init_(self):
        self.win3 = tk.Tk()
        self.win3.title("问卷回答页面")
        self.win3.geometry("1400x1200")
        self.create_label1 = tk.Label(self.win3, text="问题一:")
        self.create_label1.place(x=0, y=0, width=200, height=80)
        self.create_entry1 = tk.Entry(self.win3)
        self.create_entry1.place(x=180, y=20, width=820, height=40)
        self.create_1A = tk.Label(self.win3, text="A")
        self.create_1A.place(x=20, y=80, width=80, height=20)
        self.create_1Aentry = tk.Entry(self.win3)
        self.create_1Aentry.place(x=80, y=80, width=160)
        self.create_1B = tk.Label(self.win3, text="B")
        self.create_1B.place(x=280, y=80, width=80, height=20)
        self.create_1Bentry = tk.Entry(self.win3)
        self.create_1Bentry.place(x=340, y=80, width=160)
        self.create_1C = tk.Label(self.win3, text="C")
        self.create_1C.place(x=540, y=80, width=80, height=20)
        self.create_1Centry = tk.Entry(self.win3)
        self.create_1Centry.place(x=600, y=80, width=160)
        self.create_1D = tk.Label(self.win3, text="D")
        self.create_1D.place(x=800, y=80, width=80, height=20)
        self.create_1Dentry = tk.Entry(self.win3)
        self.create_1Dentry.place(x=860, y=80, width=160)

        self.create_label2 = tk.Label(self.win3, text="问题二:")
        self.create_label2.place(x=0, y=100, width=200, height=80)
        self.create_entry2 = tk.Entry(self.win3)
        self.create_entry2.place(x=180, y=120, width=820, height=40)
        self.create_2A = tk.Label(self.win3, text="A")
        self.create_2A.place(x=20, y=180, width=80, height=20)
        self.create_2Aentry = tk.Entry(self.win3)
        self.create_2Aentry.place(x=80, y=180, width=160)
        self.create_2B = tk.Label(self.win3, text="B")
        self.create_2B.place(x=280, y=180, width=80, height=20)
        self.create_2Bentry = tk.Entry(self.win3)
        self.create_2Bentry.place(x=340, y=180, width=160)
        self.create_2C = tk.Label(self.win3, text="C")
        self.create_2C.place(x=540, y=180, width=80, height=20)
        self.create_2Centry = tk.Entry(self.win3)
        self.create_2Centry.place(x=600, y=180, width=160)
        self.create_2D = tk.Label(self.win3, text="D")
        self.create_2D.place(x=800, y=180, width=80, height=20)
        self.create_2Dentry = tk.Entry(self.win3)
        self.create_2Dentry.place(x=860, y=180, width=160)

        self.create_label3 = tk.Label(self.win3, text="问题三:")
        self.create_label3.place(x=0, y=200, width=200, height=80)
        self.create_entry3 = tk.Entry(self.win3)
        self.create_entry3.place(x=180, y=220, width=820, height=40)
        self.create_3A = tk.Label(self.win3, text="A")
        self.create_3A.place(x=20, y=280, width=80, height=20)
        self.create_3Aentry = tk.Entry(self.win3)
        self.create_3Aentry.place(x=80, y=280, width=160)
        self.create_3B = tk.Label(self.win3, text="B")
        self.create_3B.place(x=280, y=280, width=80, height=20)
        self.create_3Bentry = tk.Entry(self.win3)
        self.create_3Bentry.place(x=340, y=280, width=160)
        self.create_3C = tk.Label(self.win3, text="C")
        self.create_3C.place(x=540, y=280, width=80, height=20)
        self.create_3Centry = tk.Entry(self.win3)
        self.create_3Centry.place(x=600, y=280, width=160)
        self.create_3D = tk.Label(self.win3, text="D")
        self.create_3D.place(x=800, y=280, width=80, height=20)
        self.create_3Dentry = tk.Entry(self.win3)
        self.create_3Dentry.place(x=860, y=280, width=160)
        self.creat_submit = tk.Button(self.win3, text='submit', command=submit2)
        self.creat_submit.place(x=500, y=330, width=100, height=45)
        self.question_var1 = tk.StringVar(self.win3)
        answerdemo.question_var1.set('')
        self.question_var2 = tk.StringVar(self.win3)
        answerdemo.question_var2.set('')
        self.question_var3 = tk.StringVar(self.win3)
        answerdemo.question_var3.set('')

answerdemo=Answer()
def answear():
    answerdemo.win3=tk.Tk()
    answerdemo.win3.title("创建问卷页面")
    answerdemo.win3.geometry("1400x1200")
    answerdemo.create_label1 = tk.Label(answerdemo.win3, text="问题一:")
    answerdemo.create_label1.place(x=0,y=0,width=200,height=80)
    answerdemo.create_entry1 = tk.Entry(answerdemo.win3)
    answerdemo.create_entry1.place(x=180,y=20,width=820,height=40)
    answerdemo.create_entry1.insert(0,Q1)
    answerdemo.create_1A = tk.Label(answerdemo.win3, text="A")
    answerdemo.create_1A.place(x=20,y=80,width=80,height=20)
    answerdemo.question_var1 = tk.StringVar(answerdemo.win3)
    answerdemo.question_var1.set('')  # 初始化变量
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var1, value="A").place(x=15,y=80)
    answerdemo.create_1Aentry = tk.Entry(answerdemo.win3)
    answerdemo.create_1Aentry.place(x=80,y=80,width=160)
    answerdemo.create_1Aentry.insert(0,A1)
    answerdemo.create_1B = tk.Label(answerdemo.win3, text="B")
    answerdemo.create_1B.place(x=280,y=80,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var1, value="B").place(x=260, y=80)
    answerdemo.create_1Bentry = tk.Entry(answerdemo.win3)
    answerdemo.create_1Bentry.place(x=340,y=80,width=160)
    answerdemo.create_1Bentry.insert(0,B1)
    answerdemo.create_1C = tk.Label(answerdemo.win3, text="C")
    answerdemo.create_1C.place(x=540,y=80,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var1, value="C").place(x=505, y=80)
    answerdemo.create_1Centry = tk.Entry(answerdemo.win3)
    answerdemo.create_1Centry.place(x=600,y=80,width=160)
    answerdemo.create_1Centry.insert(0,C1)
    answerdemo.create_1D = tk.Label(answerdemo.win3, text="D")
    answerdemo.create_1D.place(x=800,y=80,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var1, value="D").place(x=750, y=80)
    answerdemo.create_1Dentry = tk.Entry(answerdemo.win3)
    answerdemo.create_1Dentry.place(x=860,y=80,width=160)
    answerdemo.create_1Dentry.insert(0,D1)
    answerdemo.create_label2 = tk.Label(answerdemo.win3, text="问题二:")
    answerdemo.create_label2.place(x=0,y=100,width=200,height=80)
    answerdemo.create_entry2 = tk.Entry(answerdemo.win3)
    answerdemo.create_entry2.place(x=180,y=120,width=820,height=40)
    answerdemo.create_entry2.insert(0,Q2)
    answerdemo.question_var2 = tk.StringVar(answerdemo.win3)
    answerdemo.question_var2.set('')
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var2, value="A").place(x=15, y=180)
    answerdemo.create_2A = tk.Label(answerdemo.win3, text="A")
    answerdemo.create_2A.place(x=40,y=180,width=60,height=20)
    answerdemo.create_2Aentry = tk.Entry(answerdemo.win3)
    answerdemo.create_2Aentry.place(x=80,y=180,width=160)
    answerdemo.create_2Aentry.insert(0,A2)
    answerdemo.create_2B = tk.Label(answerdemo.win3, text="B")
    answerdemo.create_2B.place(x=280,y=180,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var2, value="B").place(x=260, y=180)
    answerdemo.create_2Bentry = tk.Entry(answerdemo.win3)
    answerdemo.create_2Bentry.place(x=340,y=180,width=160)
    answerdemo.create_2Bentry.insert(0,B2)
    answerdemo.create_2C = tk.Label(answerdemo.win3, text="C")
    answerdemo.create_2C.place(x=540,y=180,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var2, value="C").place(x=505, y=180)
    answerdemo.create_2Centry = tk.Entry(answerdemo.win3)
    answerdemo.create_2Centry.place(x=600,y=180,width=160)
    answerdemo.create_2Centry.insert(0,C2)
    answerdemo.create_2D = tk.Label(answerdemo.win3, text="D")
    answerdemo.create_2D.place(x=800,y=180,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var2, value="D").place(x=750, y=180)
    answerdemo.create_2Dentry = tk.Entry(answerdemo.win3)
    answerdemo.create_2Dentry.place(x=860,y=180,width=160)
    answerdemo.create_2Dentry.insert(0,D2)
    answerdemo.create_label3 = tk.Label(answerdemo.win3, text="问题三:")
    answerdemo.create_label3.place(x=0,y=200,width=200,height=80)
    answerdemo.create_entry3 = tk.Entry(answerdemo.win3)
    answerdemo.create_entry3.place(x=180,y=220,width=820,height=40)
    answerdemo.create_entry3.insert(0,Q3)
    answerdemo.question_var3 = tk.StringVar(answerdemo.win3)
    answerdemo.question_var3.set('')
    answerdemo.create_3A = tk.Label(answerdemo.win3, text="A")
    answerdemo.create_3A.place(x=20,y=280,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var3, value="A").place(x=15, y=280)
    answerdemo.create_3Aentry = tk.Entry(answerdemo.win3)
    answerdemo.create_3Aentry.place(x=80,y=280,width=160)
    answerdemo.create_3Aentry.insert(0,A3)
    answerdemo.create_3B = tk.Label(answerdemo.win3, text="B")
    answerdemo.create_3B.place(x=280,y=280,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var3, value="B").place(x=260, y=280)
    answerdemo.create_3Bentry = tk.Entry(answerdemo.win3)
    answerdemo.create_3Bentry.place(x=340,y=280,width=160)
    answerdemo.create_3Bentry.insert(0,B3)
    answerdemo.create_3C = tk.Label(answerdemo.win3, text="C")
    answerdemo.create_3C.place(x=540,y=280,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var3, value="C").place(x=505, y=280)
    answerdemo.create_3Centry = tk.Entry(answerdemo.win3)
    answerdemo.create_3Centry.place(x=600,y=280,width=160)
    answerdemo.create_3Centry.insert(0,C3)
    answerdemo.create_3D = tk.Label(answerdemo.win3, text="D")
    answerdemo.create_3D.place(x=800,y=280,width=80,height=20)
    tk.Radiobutton(answerdemo.win3, variable=answerdemo.question_var3, value="D").place(x=750, y=280)
    answerdemo.create_3Dentry = tk.Entry(answerdemo.win3)
    answerdemo.create_3Dentry.place(x=860,y=280,width=160)
    answerdemo.create_3Dentry.insert(0,D3)
    answerdemo.creat_submit = tk.Button(answerdemo.win3, text='submit',command=submit2)
    answerdemo.creat_submit.place(x=500, y=330, width=100,height=45)

    answerdemo.win3.mainloop()
def submit1():
    global Q1,Q2,Q3,A1,A2,A3,B1,B2,B3,C1,C2,C3,D1,D2,D3
    Q1 = createdemo.create_entry1.get()
    Q2 = createdemo.create_entry2.get()
    Q3 = createdemo.create_entry3.get()
    A1 = createdemo.create_1Aentry.get()
    print(A1)
    A2 = createdemo.create_2Aentry.get()
    A3 = createdemo.create_3Aentry.get()
    B1 = createdemo.create_1Bentry.get()
    B2 = createdemo.create_2Bentry.get()
    B3 = createdemo.create_3Bentry.get()
    C1 = createdemo.create_1Centry.get()
    C2 = createdemo.create_2Centry.get()
    C3 = createdemo.create_3Centry.get()
    D1=createdemo.create_1Dentry.get()
    D2=createdemo.create_2Dentry.get()
    D3=createdemo.create_3Dentry.get()
    sql = "INSERT INTO python1 (id,问题,A,B,C,D) VALUES (%s,%s,%s,%s, %s, %s)"
    data_a = (1005,Q1,A1,B1,C1,D1)
    sql = "INSERT INTO python1 (id,问题,A,B,C,D) VALUES (%s,%s,%s,%s, %s, %s)"
    data_b = (1003, Q2, A2, B2, C2, D2)
    sql = "INSERT INTO python1 (id,问题,A,B,C,D) VALUES (%s,%s,%s,%s, %s, %s)"
    data_c=(1004,Q3,A3,B3,C3,D3)
    try:
        # 执行插入操作
        cursor.execute(sql,data_a)
        cursor.execute(sql, data_b)
        cursor.execute(sql, data_c)
        # 提交事务
        conn.commit()
    except pymysql.Error as e:
        print(f"数据库错误:{e}")
        # 回滚事务
        conn.rollback()

    # sql = '''insert into python1 (id,问题,A,B,C,D) values (,%s, %s, %s,%s,%s)'''
    # circle=(4,Q1,A1,B1,C1,D1)
    # print(circle)
    # try:
    #     insert = cursor.execute(sql,circle)
    #     conn.commit()  # 提交数据库执行
    #     print("insert = ", insert)
    # except:
    #     conn.rollback()
def submit2():
    global COUNT
    COUNT=COUNT+1
    global ID
    answear1=answerdemo.question_var1.get()
    answear2 = answerdemo.question_var2.get()
    answear3 = answerdemo.question_var3.get()
    print(answear1)
    sql = "INSERT INTO python2 (id,第一问,第二问,第三问) VALUES (%s,%s,%s,%s)"
    data1 = [ID, answear1, answear2, answear3]
    ID=ID+1
    try:
        # 执行插入操作
        cursor.execute(sql, data1)

        # 提交事务
        conn.commit()
    except pymysql.Error as e:
        print(f"数据库错误:{e}")
        # 回滚事务
        conn.rollback()

    data = [[Q1, answear1],
            [Q2, answear2],
            [Q3, answear3]]
    with open('data.csv', 'a', newline='', encoding='utf-8') as file:
        csv_writer = csv.writer(file)
        for row in data:
            csv_writer.writerow(row)



def register_user():##注册页面
    username = register_username_entry.get()
    password = register_password_entry.get()
    if not username or not password:
        messagebox.showerror("错误", "用户名和密码不能为空!")
        return
    if username in users:
        messagebox.showerror("错误", "该用户名已存在!")
        return
    users[username] = password
    messagebox.showinfo(               "成功", "注册成功!")
    register_username_entry.delete(0, tk.END)
    register_password_entry.delete(0, tk.END)
def login_user():##登录
    username = login_username_entry.get()
    password = login_password_entry.get()

    if username in users and users[username] == password:
        messagebox.showinfo("成功", "登录成功!")
        win = tk.Tk()
        win.geometry("200x200")
        win.title("主页")
        zhuye1 = tk.Button(win, text="创建问卷", bg="#aaff00",command=creat)
        zhuye1.pack()
        zhuye2 =tk.Button(win,text="回答问卷",bg="red",command=answear)
        zhuye2.pack()
        zhuye3 = tk.Button(win, text="数据可视化", bg="red",command=bing)
        zhuye3.pack()
    else:
        messagebox.showerror("错误", "用户名或密码错误!")
def bing():
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    sql="select * from python2 "
    try:
        cursor.execute(sql)
        data_sum=cursor.fetchmany(COUNT)
    except Exception as e:
        print("查询异常",e.args)
    list1=[]
    list2=[]
    list3=[]

    for i in range(0,COUNT):
        list1.append(data_sum[i][1])
        list2.append(data_sum[i][2])
        list3.append(data_sum[i][3])
    count_1A=list1.count('A')
    count_1B = list1.count('B')
    count_1C = list1.count('C')
    count_1D = list1.count('D')
    list_sum1=[count_1A,count_1B,count_1C,count_1D]
    plt.pie(list_sum1, labels=['A','B','C','D'], autopct='%1.1f%%')
    plt.axis('equal')  # 确保饼图是圆的
    plt.title('第一个问题统计结果')
    plt.show()
    count_2A=list2.count('A')
    count_2B = list2.count('B')
    count_2C = list2.count('C')
    count_2D = list2.count('D')
    list_sum2=[count_2A,count_2B,count_2C,count_2D]
    plt.pie(list_sum2, labels=['A','B','C','D'], autopct='%1.1f%%')
    plt.title('第二个问题统计结果')
    plt.show()
    count_3A = list3.count('A')
    count_3B = list3.count('B')
    count_3C = list3.count('C')
    count_3D = list3.count('D')
    list_sum3 = [count_3A, count_3B, count_3C, count_3D]
    plt.pie(list_sum3, labels=['A', 'B', 'C', 'D'], autopct='%1.1f%%')
    plt.title('第三个问题统计结果')
    plt.show()


register_window = tk.Tk()
register_window.title("注册")
register_window.geometry("300x200")
register_label = tk.Label(register_window, text="注册新用户",bg="yellow")
register_label.pack()
register_username_label = tk.Label(register_window, text="用户名:")
register_username_label.pack()
register_username_entry = tk.Entry(register_window)
register_username_entry.pack()
register_password_label = tk.Label(register_window, text="密码:")
register_password_label.pack()
register_password_entry = tk.Entry(register_window, show="*")
register_password_entry.pack()
register_button = tk.Button(register_window, text="注册", command=register_user)
register_button.pack()
root = tk.Tk()
root.title("用户登录")
root.geometry("300x200")
login_label = tk.Label(root, text="用户登录",bg="yellow")
login_label.pack()
login_username_label = tk.Label(root, text="用户名:")
login_username_label.pack()
login_username_entry = tk.Entry(root)
login_username_entry.pack()
login_password_label = tk.Label(root, text="密码:")
login_password_label.pack()
login_password_entry = tk.Entry(root, show="*")
login_password_entry.pack()
login_button = tk.Button(root, text="登录", command=login_user)
login_button.pack()
root.mainloop()
cursor.close()
conn.close()

 在这系统中,是基于tkinter,类与对象,数据库连接以及数据可视化,在各个函数里的变量都要去返回或者利用类和对象去保存。

关于创建create类:

由于会在后面的连接数据库里用到用户创建页面所输入的问题和答案,而在创建问卷页面的时候,页面本身会在一个函数里,故作用域就只能在函数里,后面的数据库连接也是在一个函数里,两个函数的作用域并不能连通,而python中没有类似于C语言的传入地址操作,将所有的控件都全局化又太麻烦,于是便可以创建一个create类,只需创建一个实例就可以存储数据。

关于一个函数里的数怎么可以在另一个函数里去使用:

第一种方法是利用函数的返回值,让主函数接收 第二种方法是使用全局变量,即使用global关键字 第三种方法是使用对象和类的属性 第四种方法是使用闭包。

submit1是创建问卷提交的按钮,只要用户一点提交,系统就会自动获取问题一的答案 以及ABCD四个选项的答案内容,然后通过sql语句插入到数据库中的python1表中,这 里的Q1,A1,B1,C1,D1采用全局变量以供后面的函数里去使用

用户在带答完问卷后一点击提交按钮,系统就会去获取它第一个问题,第二个问题,第三个问题的答案并 通过sql语句传入数据库中的python2表中。

以上就是全部内容了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值