【python小工具1】随机分组的利器-随机分组编号生成软件
【文末附下载链接】
一、随机编码表的作用
在临床研究设计中,随机编码表是一个关键的工具,随机编码表在临床研究设计中扮演着至关重要的角色,是确保研究质量、可靠性和有效性的关键环节。它的作用主要体现在以下几个方面:
1. **平衡分配**:随机编码表可以帮助研究者将研究对象随机分配到不同的治疗组或对照组。这样可以确保每个组别在性别、年龄、病情严重程度等方面的差异尽可能均衡,从而减少由于这些非处理因素引起的偏倚。
2. **减少偏差**:通过随机分配,研究者可以最大限度地减少研究结果受到研究者或患者主观意愿影响的可能性。这种分配方式保证了研究结果的客观性和真实性。
3. **控制混杂变量**:在研究设计中,可能会存在一些研究者无法控制的混杂变量,如患者的饮食习惯、生活方式等。随机分配可以尽可能地平衡这些混杂因素,使它们对实验结果的影响最小化。
4. **提高效率**:随机编码表简化了分配过程,使得研究过程更加高效,节省了时间和资源。
5. **统计学意义**:随机分配是进行统计学推断的基础,它是假设检验中假设成立的基石。通过随机编码表分配,可以提高研究结果的统计学意义和可信度。
6. **伦理考量**:在对照组与实验组效果不一致时,随机分配可以确保每个研究对象都有机会接受可能更有效的治疗,这符合伦理学上的公平原则。
二、基于Python设计的随机编码表工具
使用Python 3.8
import csv # 导出CSV文件
import os # 打开CSV文件等
import random # 随机打乱顺序
import time # 获取当前时间
from tkinter import * # UI库
from tkinter import messagebox, filedialog # 弹窗和保存文件窗口
from tkinter.ttk import Treeview, Combobox # 补充UI部件库
import webbrowser # 打开网页
UI代码使用TKinter 助手生成
class WinGUI(Tk):
def __init__(self):
super().__init__()
self.__win()
self.tk_label_lrka1lu7 = self.__tk_label_lrka1lu7(self)
self.tk_radio_button_lrka2wk5 = self.__tk_radio_button_lrka2wk5(self)
self.tk_radio_button_lrkaa238 = self.__tk_radio_button_lrkaa238(self)
self.tk_label_lrkacioa = self.__tk_label_lrkacioa(self)
self.tk_table_lrkamdq0 = self.__tk_table_lrkamdq0(self)
self.tk_select_box_lrkan1yi = self.__tk_select_box_lrkan1yi(self)
self.tk_label_lrkanx7r = self.__tk_label_lrkanx7r(self)
self.tk_input_lrkaohje = self.__tk_input_lrkaohje(self)
self.tk_text_lrkapa7k = self.__tk_text_lrkapa7k(self)
self.tk_button_lrkapool = self.__tk_button_lrkapool(self)
self.tk_button_lrkaqilr = self.__tk_button_lrkaqilr(self)
self.tk_label_lrkarts9 = self.__tk_label_lrkarts9(self)
self.tk_label_lrkaxhci = self.__tk_label_lrkaxhci(self)
self.tk_input_lrkaxsvr = self.__tk_input_lrkaxsvr(self)
self.tk_input_lrkay1oy = self.__tk_input_lrkay1oy(self)
self.tk_button_lrkfv79a = self.__tk_button_lrkfv79a(self)
self.tk_button_lrkfvipu = self.__tk_button_lrkfvipu(self)
self.tk_button_lrkfx9sc = self.__tk_button_lrkfx9sc(self)
def __win(self):
self.title("随机分组编号生成软件V1.0")
# 设置窗口大小、居中
width = 659
height = 484
screenwidth = self.winfo_screenwidth()
screenheight = self.winfo_screenheight()
geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
self.geometry(geometry)
self.resizable(width=False, height=False)
def scrollbar_autohide(self, vbar, hbar, widget):
"""自动隐藏滚动条"""
def show():
if vbar: vbar.lift(widget)
if hbar: hbar.lift(widget)
def hide():
if vbar: vbar.lower(widget)
if hbar: hbar.lower(widget)
hide()
widget.bind("<Enter>", lambda e: show())
if vbar: vbar.bind("<Enter>", lambda e: show())
if vbar: vbar.bind("<Leave>", lambda e: hide())
if hbar: hbar.bind("<Enter>", lambda e: show())
if hbar: hbar.bind("<Leave>", lambda e: hide())
widget.bind("<Leave>", lambda e: hide())
def v_scrollbar(self, vbar, widget, x, y, w, h, pw, ph):
widget.configure(yscrollcommand=vbar.set)
vbar.config(command=widget.yview)
vbar.place(relx=(w + x) / pw, rely=y / ph, relheight=h / ph, anchor='ne')
def h_scrollbar(self, hbar, widget, x, y, w, h, pw, ph):
widget.configure(xscrollcommand=hbar.set)
hbar.config(command=widget.xview)
hbar.place(relx=x / pw, rely=(y + h) / ph, relwidth=w / pw, anchor='sw')
def create_bar(self, master, widget, is_vbar, is_hbar, x, y, w, h, pw, ph):
vbar, hbar = None, None
if is_vbar:
vbar = Scrollbar(master)
self.v_scrollbar(vbar, widget, x, y, w, h, pw, ph)
if is_hbar:
hbar = Scrollbar(master, orient="horizontal")
self.h_scrollbar(hbar, widget, x, y, w, h, pw, ph)
self.scrollbar_autohide(vbar, hbar, widget)
def __tk_label_lrka1lu7(self, parent):
label = Label(parent, text="分组方式:", anchor="center", )
label.place(x=3, y=92, width=216, height=30)
return label
def __tk_radio_button_lrka2wk5(self, parent):
rb = Radiobutton(parent, text="平均分组", )
rb.place(x=5, y=142, width=96, height=30)
return rb
def __tk_radio_button_lrkaa238(self, parent):
rb = Radiobutton(parent, text="自由分组", )
rb.place(x=108, y=143, width=110, height=30)
return rb
def __tk_label_lrkacioa(self, parent):
label = Label(parent, text="组数", anchor="center", )
label.place(x=3, y=7, width=216, height=30)
return label
def __tk_table_lrkamdq0(self, parent):
# 表头字段 表头宽度
columns = {"序号": 68, "编号": 206, "组别": 68}
tk_table = Treeview(parent, show="headings", columns=list(columns), )
for text, width in columns.items(): # 批量设置列属性
tk_table.heading(text, text=text, anchor='center')
tk_table.column(text, anchor='center', width=width, stretch=False) # stretch 不自动拉伸
tk_table.place(x=232, y=5, width=345, height=336)
self.create_bar(parent, tk_table, True, False, 232, 5, 345, 336, 659, 484)
return tk_table
def __tk_select_box_lrkan1yi(self, parent):
cb = Combobox(parent, state="readonly", )
cb['values'] = ("列表框", "Python", "Tkinter Helper")
cb.place(x=21, y=47, width=159, height=30)
return cb
def __tk_label_lrkanx7r(self, parent):
label = Label(parent, text="分组人数", anchor="center", )
label.place(x=3, y=182, width=216, height=30)
return label
def __tk_input_lrkaohje(self, parent):
ipt = Entry(parent, )
ipt.place(x=4, y=223, width=218, height=30)
return ipt
def __tk_text_lrkapa7k(self, parent):
text = Text(parent)
text.place(x=233, y=349, width=410, height=123)
self.create_bar(parent, text, True, False, 233, 349, 410, 123, 659, 484)
return text
def __tk_button_lrkapool(self, parent):
btn = Button(parent, text="预览编号", takefocus=False, )
btn.place(x=6, y=373, width=213, height=30)
return btn
def __tk_button_lrkaqilr(self, parent):
btn = Button(parent, text="导出编号", takefocus=False, )
btn.place(x=6, y=428, width=211, height=30)
return btn
def __tk_label_lrkarts9(self, parent):
label = Label(parent, text="编号起始值", anchor="center", )
label.place(x=4, y=265, width=113, height=30)
return label
def __tk_label_lrkaxhci(self, parent):
label = Label(parent, text="编 号 样 式", anchor="center", )
label.place(x=5, y=311, width=113, height=30)
return label
def __tk_input_lrkaxsvr(self, parent):
ipt = Entry(parent, )
ipt.place(x=127, y=264, width=93, height=30)
return ipt
def __tk_input_lrkay1oy(self, parent):
ipt = Entry(parent, )
ipt.place(x=127, y=311, width=93, height=30)
return ipt
def __tk_button_lrkfv79a(self, parent):
btn = Button(parent, text="教程", takefocus=False, )
btn.place(x=587, y=7, width=50, height=30)
return btn
def __tk_button_lrkfvipu(self, parent):
btn = Button(parent, text="官网", takefocus=False, )
btn.place(x=589, y=57, width=50, height=30)
return btn
def __tk_button_lrkfx9sc(self, parent):
btn = Button(parent, text="关于", takefocus=False, )
btn.place(x=589, y=112, width=50, height=30)
return btn
三、使用方法
3.1 方法概要:
--------------- 1.组数:即你需要的分组数,比如分为中药组、西药组、安慰剂组3组,那么你的组数就是 3 --------------- 2.分组方式:平均分组表示你的每个组人数都是一样的,自由分组表示你每组人数不一样 --------------- 3.分组人数:如果你是平均分组,你只需要填写1分组的人数即可,例如你每组30人,填写 30 即可,填了多个默认取第一个;如果你是自由分组,需要写出每组的人数,例如第一组40,第二组30,第三组60,需要填写为40 30 60 --------------- 4.编号样式:可以修改前缀或者后缀,例如你想要编号前面都添加BM, 则填写 BM编号 ; 后缀的就是填写 编号BM ;不填写默认直接输出编号。 --------------- 5.预览编号:在左侧可以预览生成的编号,再次点击会重新生成新的预览。 --------------- 6.导出编号:编号导出为CSV格式 ---------------
3.2 编码样式
如果想要添加前缀或者后缀,只需要在样式里面添加就可以
前缀或者后缀可以自由选择,也可以不加,但是必须保留 编号 关键词
3.3 导出编码表
生成完成后可以选择打开随机数表文件
结束语:
这是一个简单的随机软件,如果是多中心的研究可以分开多次生成,然后修改 编号起始值 以确定是哪个中心的,比如组长中心可以 1001开始 , 第二个分中心可以是 2001 开始,以此类推等,也可以通过不同的前缀来确定中心,比如福建中心使用 FJ10001 , 广东中心使用GD1001开始等。
下载链接
随机分组编号生成软件V1.0 及 源码
2024-01-19
部分内容具有时效性,如有失效,请联系邮箱:heiyingcyh@163.com