python随机面试顺序小程序

一、小程序介绍

功能介绍:例如,输入学生总数为12,题目总数为20,点击一次随机抽题,程序则会为学生随机抽取1-20中的题号,输出文本框则会显示:第一名同学的题目是:5.共可以点击12次,每次输出的结果不会重复,当点击第13次,则会提示抽取完毕。
注:如果输入的学生总数大于题目总数,则输出文本框会提示题目总数太少
应用介绍:可以简单的为高校进行复试时,抽取专业题。
由于没有进行多次测试,只是简单完成了功能,如有bug请评论,自己也将一一问答。

在这里插入图片描述
没有对界面进行美化,只是简单的将需要实现的功能完成,下面将每一步的完成过程呈现给大家。(自己也是初学,有不对的地方请大家多多指教)本次设计需要导入的python包如:

from tkinter import *
import random
import tkinter as tk

二、设计思路

2.1界面设计

1)窗口创建与布局
做界面,首先需要创建一个窗口,Python Tkinter 创建窗口很简单,代码如下:

'''建立窗口并命名为 随机抽题小程序,窗口大小为500x400'''
        root = tk.Tk()
        root.title("随机抽题小程序")
        root.geometry('500x400')
        frame = Frame(root) #Frame(框架)组件是在屏幕上的一个矩形区域。Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充。
        frame.pack(padx=10, pady=30, ipadx=4) #采用pack布局
        root.mainloop()

上述代码效果图如下:
在这里插入图片描述
2)控件创建
本次任务需要创建的控件有:标签控件“学生总数”以及输入文本框,标签控件“题目总数”以及输入文本框,输出文本框。接下啦我们一个一个来。
首先我们创建标签控件“学生总数”以及输入文本框:

        '''创建学生总数标签'''
        lab_stu = Label(frame, text="学生总数:", font=("华文行楷", 20))
        lab_stu.grid(row=0, column=0, padx=5, pady=5, sticky=W) # row表示行,column表示列,表示将其放在Frame的第0行第0列

        '''创建学生人数输入文本框'''
        u = StringVar()
        entry_stu = Entry(frame, textvariable=u)
        entry_stu.grid(row=0, column=1, sticky='ew', columnspan=2)

效果如下图:
在这里插入图片描述
“题目总数”标签以及输入文本框创建:

        '''题目总数标签'''
        lab_ques = Label(frame, text="题目总数:", font=("华文行楷", 20))
        lab_ques.grid(row=1, column=0, padx=5, pady=5, sticky=W)

        '''创建题目总数输入文本框'''
        p = StringVar()
        ent_ques = Entry(frame, textvariable=p)
        ent_ques.grid(row=1, column=1, sticky='ew', columnspan=2)

效果如下:
在这里插入图片描述
标签控件已经完成,接下来我们来创建“随机抽题"按钮控件:

'''创建抽题按钮'''
        button = Button(frame, text="随机抽题", command=chouti, default='active', font=("华文行楷", 15))
        button.grid(row=3, column=2)#其中最终的参数为command,意思是我点击之后会执行"chouti()"这个函数,这个函数后续将会介绍

效果如下:
在这里插入图片描述
最后我们加上界面最下面的输出文本框:

        '''创建结果输出文本框,初始化文本框中的内容为:请输入,点击抽题!'''
        text_print = tk.Text(root, width=20, height=20)
        text_print.pack(fill=tk.X, side=tk.BOTTOM)
        text_print.insert(2.0, '\n\n\n\n\n\n\n\t\t\t请输入,点击抽题!')

效果如下:
在这里插入图片描述
至此,整个界面的布局已经完成,在这里介绍一下其中的一些小细节。
标签控件“学生总数”坐标为(0,0)
输入文本框坐标为(0,1)
标签控件“学生总数”坐标为(1,0)
输入文本框坐标为(1,1)
”随机抽题“按钮坐标为(3,2)

这时候有人可能会问,为什么输出文本框在最下面,因为输出文本框采用的是pack布局,简单来说这是一种按顺序自上而下的布局方式,所以当我使用text_print.pack(fill=tk.X, side=tk.BOTTOM)时,则会在界面下面生成输出文本框。关于布局方式,后续自己也将尽快写出相关知识,请关注博客。

2.2 功能设计

1)抽题功能
思路:输入学生总数与题目总数后,第一次点击随机抽取按钮后,则会触发chouti()函数,在该函数中,会接收"学生总数"输入文本框中的内容self.n1 = entry_stu.get() # 获取学生总人数和”题目总数“输入文本框的内容self.n2 = entry_ques.get() # 获取题目总数,如果self.n1>self.n2,输出文本框中会显示"题目总数太少,请重新输入!!".否则,则会在题目总数范围内产生随机题号question_num = random.randint(1, int(self.n2)) # 产生随机题号,并且在输出文本框中显示"第1名同学的题目是:*"(*为一个随机数字),此时会将此次产生的随机数字保存在列表中global_str.append(question_num) # 将此次抽取到的题号添加到global_str列表中。
第N次点击"随机抽题"后,如果N大于学生总数self.n1,意味着所有学生都已经抽取完毕了,输出文本框中会显示"已抽取完毕,请重新输入!!!".否则,继续随机抽题question_num = random.randint(1, int(self.n2)) # 产生随机题号并且判断此次抽取的题号question_num是否和之前抽取的重复了,也就是判断question_num是否存在global_str列表中,如果重复了,则重新抽取,直到该题号不再与之前抽过的题号重复。具体代码如下:

        def chouti():
            global global_num  # 已抽取的人数,默认为1,为全局变量
            global global_str  # 定义一个空列表,已抽取的题号,为全局变量
            self.n1 = entry_stu.get()  # 获取学生总人数
            self.n2 = entry_ques.get()  # 获取题目总数
            question_num = random.randint(1, int(self.n2))  # 产生随机题号
            if int(self.n1) <= int(self.n2):  # 判断学生人数是否小于题目总数
                if global_num <= int(self.n1):
                    while question_num in global_str:  # 判断是否在列表中
                        question_num = random.randint(1, int(self.n2))  # 产生随机题号
                    global_str.append(question_num)  # 将此次抽取到的题号添加到s列表中
                    self.output_text = '第' + str(global_num) + '名同学的题目是:' + str(question_num) + '\n'
                    text_print.insert(3.0, self.output_text)  # 将抽取到的题号输出到文本框中
                    global_num = global_num + 1
                else:
                    text_print.insert(3.0, '已抽取完毕,请重新输入!!!\n')
                    global_num = 1
                    global_str = []
            else:
                text_print.insert(3.0, '题目总数太少,请重新输入!!\n')

注:此处的已抽取的人数global_num与已抽取的题号global_str为全局变量,因为每一次点击按钮调用一次函数,如果使用的是局部变量,再下一次点击按钮调用chouti函数时,这两个变量会被清空。因此定义其为全部变量。

三、完整代码

注:小编用的是python3.7版本,不知道其他版本是否会出现不明问题。
该小程序可以打包成可执行程序exe文件,如有需要,可以评论区留言。

from tkinter import *
import random
import tkinter as tk


class random_question:
    def __init__(self):

        def chouti():
            global global_num  # 定义一个空列表,为全局变量
            global global_str  # 定义一个空列表,已抽取的题号,为全局变量
            self.n1 = entry_stu.get()  # 获取学生总人数
            self.n2 = entry_ques.get()  # 获取题目总数
            question_num = random.randint(1, int(self.n2))  # 产生随机题号
            if int(self.n1) <= int(self.n2):  # 判断学生人数是否小于题目总数
                if global_num <= int(self.n1):
                    while question_num in global_str:  # 判断是否在列表中
                        question_num = random.randint(1, int(self.n2))  # 产生随机题号
                    global_str.append(question_num)  # 将此次抽取到的题号添加到s列表中
                    self.output_text = '第' + str(global_num) + '名同学的题目是:' + str(question_num) + '\n'
                    text_print.insert(3.0, self.output_text)  # 将抽取到的题号输出到文本框中
                    global_num = global_num + 1
                else:
                    text_print.insert(3.0, '已抽取完毕,请重新输入!!!\n')
                    global_num = 1
                    global_str = []
            else:
                text_print.insert(3.0, '题目总数太少,请重新输入!!\n')

        '''建立窗口并命名为面试顺序小程序,窗口大小为500x400'''
        root = tk.Tk()
        root.title("随机抽题小程序")
        root.geometry('500x400')

        '''创建窗口'''
        text = tk.Text(root, width=200)

        frame = Frame(root)
        frame.pack(padx=10, pady=30, ipadx=4)

        '''创建学生总数标签'''
        lab_stu = Label(frame, text="学生总数:", font=("华文行楷", 20))
        lab_stu.grid(row=0, column=0, padx=5, pady=5, sticky=W)

        '''创建学生人数输入文本框'''

        u = StringVar()
        entry_stu = Entry(frame, textvariable=u)
        entry_stu.grid(row=0, column=1, sticky='ew', columnspan=2)

        '''题目总数标签'''
        lab_ques = Label(frame, text="题目总数:", font=("华文行楷", 20))
        lab_ques.grid(row=1, column=0, padx=5, pady=5, sticky=W)

        '''创建题目总数输入文本框'''
        p = StringVar()
        entry_ques = Entry(frame, textvariable=p)
        entry_ques.grid(row=1, column=1, sticky='ew', columnspan=2)

        '''创建抽题按钮'''
        button = Button(frame, text="随机抽题", command=chouti, default='active', font=("华文行楷", 15))
        button.grid(row=3, column=2)

        # lab3 = Label(frame, text="")
        # lab3.grid(row=2, column=0, sticky=W)

        '''创建结果输出文本框'''
        text_print = tk.Text(root, width=20, height=20)
        text_print.pack(fill=tk.X, side=tk.BOTTOM)
        text_print.insert(2.0, '\n\n\n\n\n\n\n\t\t\t请输入,点击抽题!')
        '''以下代码居中显示窗口'''

        root.update_idletasks()
        x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
        y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
        root.geometry("+%d+%d" % (x, y))
        root.mainloop()


global_str = []
global_num = 1
random_question()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值