最近上课学生多名字记不住,名册忘记了带,要点名怎么办,好久没有写代码了,于是自己写了个点名软件,记录下吧,第一次接触TK也不是太熟悉,写的不太好,记录下源代码 以后遇到要写桌面软件还是可以耍耍的。

tk:文档  https://wiki.python.org/moin/TkInter

tk是python 自带的一个GUI模块

效果:

背景图:

icon图标:

源码:

  1. from win32com.client import Dispatch
  2. from tkinter import *
  3. import tkinter as tk
  4. from PIL import Image
  5. from PIL import ImageTk
  6. import os
  7. import re
  8. import random
  9. from threading import Thread
  10. import pythoncom
  11. import time
  12.  
  13. stu_path = "名单.txt" # 学生名单路径
  14.  
  15. def speaker(str):
  16. """
  17. 语音播报
  18. :param str: 需要播放语音的文字
  19. """
  20. speaker = Dispatch("SAPI.SpVoice")
  21. speaker.Speak(str)
  22.  
  23. class Rollllcall():
  24. def __init__(self):
  25. self.win = Tk()
  26. self.win.title("Python课堂点名器")
  27. self.win.iconbitmap("image/icon.ico")
  28. self.win.geometry("750x450")
  29. self.win.resizable(False, False) # 不允许放大窗口,避免放大导致布局变形带来的麻烦
  30. self.start = False # 开始按钮的状态
  31. # 增加背景图片
  32. img = Image.open('image/back.jpg')
  33. img = ImageTk.PhotoImage(img, size=(650, 450))
  34. theLabel = tk.Label(self.win, # 绑定到一个框架
  35. # justify=tk.LEFT, # 对齐方式
  36. image=img, # 加入图片
  37. compound=tk.CENTER, # 关键:设置为背景图片
  38. font=("华文行楷", 20), # 字体和字号
  39. fg="white",
  40. ) # 前景色
  41. theLabel.place(x=0, y=0, relwidth=1, relheight=1)
  42. self.var = tk.StringVar() # 储存文字的类
  43. self.var.set("别紧张") # 设置文字
  44. NameLabel = tk.Label(self.win, textvariable=self.var, # 绑定到一个框架
  45. justify=tk.LEFT, # 对齐方式
  46. compound=tk.CENTER, # 关键:设置为背景图片
  47. font=("华文行楷", 35), # 字体和字号
  48. fg="SeaGreen",
  49. width=10,
  50. ) # 前景色
  51. NameLabel.place(x=280, y=100)
  52.  
  53. # 多选框
  54. self.checkVar = IntVar()
  55. Checkbutton(self.win, text="语音播放", variable=self.checkVar,
  56. onvalue=1, offvalue=0, height=0, width=0).place(x=170, y=410)
  57. tk.Button(self.win, text='编辑学生名单', height=0, width=0, command=self.pop_win).place(x=520, y=408)
  58.  
  59. self.theButton = tk.Button(self.win, text="开始", font=("华文行楷", 13), fg="SeaGreen", width=20,
  60. command=self.callback)
  61. self.theButton.place(x=300, y=360) # 调整按钮的位置
  62. self.win.mainloop()
  63.  
  64. def save_names(self, pop, t):
  65. """
  66. 保存名单内容
  67. :param win: #弹出窗
  68. :param t: 文本框对象
  69.  
  70. """
  71. names = t.get(0.0, "end")
  72. if re.search(",", names):
  73. textlabel = tk.Label(pop, text="注意:名单不能使用中文逗号分隔", font=("华文行楷", 12), # 字体和字号
  74. fg="red", )
  75. textlabel.place(y=190, x=10)
  76. else:
  77. with open(stu_path, "w", encoding="utf-8") as f:
  78. f.write(names)
  79. pop.destroy()
  80.  
  81. # 编辑学生姓名
  82. def pop_win(self):
  83. pop = Tk(className='学生名单编辑') # 弹出框框名
  84. pop.geometry('450x250') # 设置弹出框的大小 w x h
  85. pop.iconbitmap("image/icon.ico")
  86. pop.resizable(False, False)
  87.  
  88. # 用来编辑名单的文本框
  89. t = tk.Text(pop, width=61, height='')
  90. t.place(x=10, y=10)
  91. # 判断文件存不存在
  92. result = os.path.exists(stu_path)
  93. if result:
  94. # 存在
  95. with open(stu_path, "r", encoding='utf-8') as f:
  96. names = f.read().strip("\n\r\t")
  97. t.insert("end", names)
  98.  
  99. textlabel = tk.Label(pop, text="学生名单请以,(英文状态)的逗号分隔:\n如:刘亦菲,周迅", font=("华文行楷", 12), # 字体和字号
  100. fg="SeaGreen", )
  101. textlabel.place(y=150, x=10)
  102.  
  103. # 点击确定保存数据
  104. tk.Button(pop, text='确定', height=0, width=0, command=lambda: self.save_names(pop, t)).place(y=200, x=340)
  105. tk.Button(pop, text='取消', height=0, width=0, command=pop.destroy).place(y=200, x=400)
  106.  
  107. def callback(self):
  108. # 改变开始按钮的状态
  109. self.start = False if self.start else True
  110. # 开始随机名单之后修改按钮上的文字
  111. self.theButton["text"] = "就你了"
  112. # 开启一个子线程去做操作随机名字,以及语言播报
  113. self.t = Thread(target=self.mod_stu_name, args=(self.var, self.checkVar))
  114. self.t.start()
  115.  
  116. def mod_stu_name(self, var, checkVar):
  117. # 随机读取名单中的一个
  118. pythoncom.CoInitialize() # 子线程中调用win32com 语音播放需要设置这一行
  119. if not os.path.exists(stu_path):
  120. var.set("请添加名单")
  121. return None
  122. with open(stu_path, "r", encoding="utf-8") as f:
  123. names = f.read().strip("\n\t\r,")
  124. if not names:
  125. var.set("请添加名单")
  126. return None
  127. name_list = names.split(",")
  128.  
  129. random_name = ""
  130. while self.start:
  131. random_name = random.choice(name_list)
  132. var.set(random_name) # 设置名字随机出现
  133. time.sleep(0.1)
  134. self.theButton["text"] = "开始" # 选中之后将按钮重新修改成 开始
  135. # 语音播报
  136. if checkVar.get() == 1:
  137. speaker(random_name)
  138.  
  139. if __name__ == '__main__':
  140. Rollllcall()

利用python+tkinter开发一个点名软件的更多相关文章

  1. 利用python+tkinter做一个简单的智能电视遥控器

    要通过python实现遥控器功能分两步: 第一步:开发图形化界面,以暴风TV的遥控器按钮为例 第二步:使PC端给电视发送相应指令(此步骤需要打开电视的adb开关) 现在就开始第一步操作实现遥控器功能, ...

  2. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  3. 如何利用开源思想开发一个SEO友好型网

    如果你有一个网站需要去做SEO优化的时候,不要期望你的努力能立即得到回报.耐心等待并更正内容营销策略,最终会发现你的网站很受用户欢迎.下面就教你如何利用开源思维开发一个SEO友好型网站! 首先,你应该 ...

  4. 开发一个FTP软件

    一.开发一个多并发的FTP server 需求: .允许同时支持多用户在线 .用户认证 .用户空间配额 .权限限制 .可上传下载.上传下载过程中显示进度条 .用户可远程切换目录.查看服务端文件列表等 ...

  5. 利用Python脚本完成一个Fat-tree型的拓扑

    利用Python脚本完成如下图所示的一个Fat-tree型的拓扑(交换机和主机名需与图中一致,即s1~s6,h1~h8) 参考资料 修改代码如下: from mininet.topo import T ...

  6. python Tkinter 写一个弹球的小游戏

    #!usr/bin/python #-*- coding:utf-8 -*- from Tkinter import * import Tkinter import random import tim ...

  7. 基于python tkinter的课堂点名小程序

    import datetime import json import os import random import tkinter as tk import openpyxl # 花名册文件名很多人 ...

  8. python -Tkinter 实现一个小计算器功能

    文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X  则需要将 tkinter 改为Tk ...

  9. 如何利用python教程判断一个 IP 在不在线?

    假设今天老板给我们一个任务,让我们判断一下一个 IP 在不在线.我们随手用 python 写一个 ping IP 的代码: import os host = input('请输入要检测的 IP : ' ...

随机推荐

  1. 扩增子分析QIIME2-4分析实战Moving Pictures

    本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点   ...

  2. 初学者怎么快速掌握Linux运维?

    2018年里,Linux运维的职位数量和平均薪资水平仍然持续了去年的强劲增幅,比很多开发岗位涨的都快.从研究机构的数据来看,Linux职位数量和工资水平涨幅均在IT行业的前五之列,比去年的表现还要好一 ...

  3. join 和 left join 和 right join的区别?

    join等价于 inner join 是内连接 ,返回两个表都有的符合条件的行. left join 是左连接,返回坐表中所有的行以及右表中符合条件的行. right join右连接,是返回右表中所有 ...

  4. 2 Button

    // <summary> /// 设置透明按钮样式 /// </summary> private void SetBtnStyle(Button btn) { btn.Flat ...

  5. mysql中文乱码归纳总结

    今天使用sqlalchemy往mysql数据库里插入数据的时候,发生了错误,因为字段包含中文,所以报错.在问题解决之后做一个总结.   mysql中文乱码包括几个方面.mysql服务器层面.mysql ...

  6. 基本数据类型:字符串(str)

    一.字符串的定义和创建 字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,' '或'' ''或''' '''中间包含的内容称之为字符串,总之加了引号的字符都被认为是字符串! 创建: > ...

  7. 创建broker配置

    1.准备工作 ■ 创建oracle11g的primary和standby库,物理standby,最大性能模式 ■ DG_BROKER_START设置为TRUE 2.创建broker配置 DGMGRL& ...

  8. mysql5.7 简易修改mysql密码

    MySQL 5.7 mysql库的user表中已经不再有password字段,取而代之的为authentication_string修改语法相同,步骤也相同.注意:/etc/my.cnf这个配置文件中 ...

  9. hdu_1859_最小长方形_201402282048

    最小长方形 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  10. 为什么视频流一般都用UDP

    我们知道TCP 和 UDP的一个区别之一就是TCP要保证丢失的package会被再次重发,确保对方能够收到. 而在视频播放中,如果有一秒钟的信号确实,导致画面出现了一点瑕疵,那么最合适的办法是把这点瑕 ...