最近上课学生多名字记不住,名册忘记了带,要点名怎么办,好久没有写代码了,于是自己写了个点名软件,记录下吧,第一次接触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. Docker是什么?可以用Docker做什么?

    作者:刘允鹏 链接:https://www.zhihu.com/question/28300645/answer/67707287 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  2. Vue项目在IE浏览器报错polyfill-eventsource added missing EventSource to window

    已经安装了babel-polyfill,依然报错.

  3. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  4. JAVA中对事物的理解

    1.事物是一组操作数据的集合动作 (场景:再开发的时候相信大家都遇到主表和子表的插入问题,当主表插入成功时,子表没有插入成功,这时候我们就要把主表的数据回滚,这个时候我们就要用到事物了) 2.一组处理 ...

  5. redis 和 memcached的区别

    redis和memcached的区别   Redis 和 Memcache 都是基于内存的数据存储系统.Memcached是高性能分布式内存缓存服务:Redis是一个开源的key-value存储系统. ...

  6. jenkins简单持续构建

    一.安装jenkins 二.将需要持续构建的java project打包成jar文件 1.选择导出需要运行的main方法所在java类

  7. JSON中getInt()和optInt()的区别

    最近在用org.json这个包解析json的时候,发现谷歌提供两种不同的数据类型获取方法,比如说针对Int类型,提供了getInt()和optInt()两种方式,谷歌文档中的说明如下: 那么这两者有什 ...

  8. [TS-A1488][2013中国国家集训队第二次作业]魔法波[高斯消元]

    暴力直接解异或方程组,O(n^6)无法接受,那么我们考虑把格子分块,横着和竖着分别分为互不影响的块,这样因为障碍物最多不超过200个,那么块的个数最多为2*(800+200)=2000个,最后用bit ...

  9. Jmeter 学习imooc

    https://www.imooc.com/video/14718 1. BS Vs CS BS架构: browser server CS架构: Client server(安装到本地)

  10. 读取到配置文件的C语言的接口实现

    /*********************************************************************  * Author  : Samson  * Date   ...