如何用python GUI(tkinter)写一个闹铃小程序(思路详解)

事情的起因是帮助一个朋友写一个程序,来控制他们单位的铃声,平时竟然是手动打铃(阔怕)

事情的第一步:理清思路。需要用到python的几个知识:1、tkinter一些函数控件,2、控件和函数之间的联系(主用TreeView控件),3、读写数据入txt文档(高级版可换为数据库),4、数据的类的封装。

需要其他方面的知识:1、简单设计界面布局,2、确保程序易于使用的不反人类细节。

考虑清楚后,那么我开始学习一下相关知识。

(1)python中作为面向对象的一份子,Class(类)和Instance(实例)的两个概念必须要清楚,

class Student(object):
    pass

class后面紧接着是类名,Student,紧接着是(object),表示该类是从哪个类继承下来的,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:
eg:  Tom = Student('Bart Simpson', 59)
要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入。
PS:看了网上几个教程,有的class类出现不同的写法:
class App:   class App():   class App(Frame):
需要特别说明的是,不带()与带()效果一样,而Class A(B):是继承关系,A继承了B。
(2)tkinter中ttk中的Treeview控件,

ttk.Treeview(self.frame_center, show="headings", height=18, columns=("a", "b", "c", "d", "e"))

show="heading"表示第一行是隐藏的,show="tree"表示显示第一行。

其实项目没什么难度,贴上源代码:

# coding=utf-8
import tkinter
from tkinter import ttk
import os,sys
import time
from playsound import playsound
import threading
import winsound
class Application():
    def __init__(self,master):
        self.master=master  #master就是Tk(),也就是windows
        self.num01=0  # 用于两个button状态切换
        self.run01=1    # 用于 启动和停止 状态切换,1为启动
        self.datatxt = "日常模式_保存配置.txt"    #用于 储存生成txt文件
    def creatThings(self):
        self.myStr01 = tkinter.StringVar()     #如果想让该变量成为整个Class的全局变量,则必须加self
        self.myStr01.set('正在运行')
        self.myVar01 = tkinter.IntVar()
        self.buttonA1=tkinter.Button(self.master,text="日常",bg='#D1EEEE',width=20,command=self.buttonA1_Func)
        self.buttonB2=tkinter.Button(self.master,text="特殊",bg='#D1EEEE',width=20,command=self.buttonB2_Func)
        self.buttonA1.pack()
        self.buttonB2.pack()
        self.label_status=tkinter.Label(self.master,text="当前状态",background="#ffffe0",width=20)
        self.label_status.pack()
        self.label_st2=tkinter.Label(self.master,bg='green', fg='yellow', font=('Arial', 12), width=10, textvariable=self.myStr01)
        self.label_st2.pack()
        self.radioButtonA1=tkinter.Radiobutton(self.master,text="启动",variable=self.myStr01,value='启动',command=self.Change_SelectionA)
        # 其中variable=self.myStr01, value='启动'的意思就是,当我们鼠标选中了其中一个选项,把value的值'启动'放到变量self.myStr01中,然后赋值给variable
        self.radioButtonB2 = tkinter.Radiobutton(self.master, text="停止",variable=self.myStr01,value='停止',command=self.Change_SelectionB)
        self.radioButtonA1.pack()
        self.radioButtonB2.pack()
        self.buttonC3 = tkinter.Button(self.master, text="保存当前配置",width=15,height=2,command=self.Set2Txt)#
        self.buttonC3.pack()
        self.buttonD4 = tkinter.Button(self.master, text="新建事件",width=15,height=2,command=self.New_Building)
        self.buttonD4.pack()
    def creatTree(self):
        treecol=["序号","时间","事件","铃声"]
        global tree
        tree=self.tree=ttk.Treeview(self.master,columns=treecol, height=10, show="headings")
        tree.column('0', width=50, anchor='center')  # 指定第一列的宽度和名称, 如果show = "headings", 这一列就被隐藏。
        tree.column('1', width=150, anchor='center')    #表示列,headings时不显示
        tree.column('2', width=150, anchor='center')
        tree.column('3', width=350, anchor='center')
        tree.heading('0', text='序号')
        tree.heading('1', text='时间')
        tree.heading('2', text='事件')
        tree.heading('3', text='铃声')
        self.data = {"item0": ["1", "06:20", "起床", "起床号.mp3"],"item1": ["2", "06:30", "早操", "早操号.mp3"]}
        tree.insert('', 'end', values=self.data["item0"])
        tree.insert('', 'end', values=self.data["item1"])   #这里,使用字典不适合,无序
        self.newdata = {"num01": ["", "", "", ""]}
        tree.pack()     #这一行是必须的
        tree.bind('<ButtonRelease-1>', self.Tree_Selection)
        print("阶段执行检测")
    def Gui_arrange(self):
        self.buttonA1.place(x=100, y=20)
        self.buttonB2.place(x=300, y=20)
        self.tree.place(x=50,y=100)
        self.label_status.place(x=950,y=80)
        self.label_st2.place(x=980,y=105)
        self.radioButtonA1.place(x=950,y=150)
        self.radioButtonB2.place(x=1050, y=150)
        self.buttonC3.place(x=1000,y=500)
        self.buttonD4.place(x=600,y=500)
    #各种点击函数集合:
    def Change_SelectionA(self): #用于点选框变更
        self.label_st2.config(text=self.myStr01.get())
        self.run01=1
    def Change_SelectionB(self):  # 用于点选框变更
        self.label_st2.config(text=self.myStr01.get())
        self.run01=0
    def WriteToTree(self):  #未完成
        #清空newdata中原始数据
        for item in self.tree.get_children():
            self.tree.delete(item)
        f2=open(os.getcwd()+r"\\"+self.datatxt,'r')     #读数据文件datatxt
        cont2=f2.readlines()
        #self.newdata = {"num01": ["", "", "", ""]}  #当然上面这个不行
        self.newdata = cont2
        for i in range(len(self.newdata)):
            '''
            for j in range(len(cont2[0])):  # 取数组中一个元素的最大长度
                self.newdata[i][j].replace('\'','')
            '''
            a=self.newdata[i]
            b=a.replace('\'','')    # b是字符串
            c=b.split(',')          # c变为了数组
self.tree.insert('',i,values=c)
#self.tree.update() 该行好像没起什么作用
# self.tree.insert('','end',values=["1", "06:20", "起床", "起床号2.mp3"])
def New_Building(self):
self.tree.insert('','end',values=["1", "06:20", "起床", "起床号2.mp3"])
def Tree_Selection(self,event):  #这里的event和前面的self是同一个东东, 如果单一参数的话会报错
for item2 in tree.selection():           item_text=tree.item(item2
,"values")  #item是I001、I002
print(item_text[1:3])
print(item_text)
#item1 = tree.selection()[0]
        #print(item1)
        column = tree.identify_column(event.x)  #列column
row=tree.identify_row(event.y)  #行row
print("正确的column是"+column)
print("the items has been selected = ",tree.selection())        entryedit=tkinter.Text(
self.master,width=40,height=2)        entryedit.place(
x=90,y=60)
def save_edit():
print("==== = ", tree.selection())            tree.set(item2
,column=column,value=entryedit.get(0.0,"end").replace('\n',''))
# 官方手册解释 set the value of given column in given item to the specified value.
            entryedit.destroy()            Obutton.destroy()        Obutton=tkinter.Button(
self.master,text="更 改",bg="gray",width=4,command=save_edit)        Obutton.place(
x=390,y=60)
def Set2Txt(self):
print("num01:",self.num01)
if self.num01==0:            file01=
open(currentDir+'\\日常模式_保存配置.txt','w')
for i in range(21):  # 写入数据
#问题是如何输出当前表格数的最大行数,以后再说
try:                    item_text = tree.item(
"I00"+str(i+1), "values") #这是针对列表写的
                    file01.write(str(item_text).replace("(", "").replace(")", "") + '\n') #这是针对列表写的
except:
#file01.write(str(item_text).replace("(","").replace(")","")+'\n')
pass
            file01.close()
elif self.num01==1:            file02=
open(currentDir+'\\休息模式_保存配置.txt','w')
for i in range(21):  # 写入数据
#问题是如何输出当前表格数的最大行数,以后再说
try:                    item_text = tree.item(
"I00"+str(i+1), "values")                    file02.write(
str(item_text).replace("(", "").replace(")", "") + '\n')
except:
pass
            file02.close()
def buttonA1_Func(self):
self.num01 = 0
self.buttonA1['bg']='#71C671'
self.buttonB2['bg'] = '#D1EEEE'
print("效果生成 =0")
self.datatxt="日常模式_保存配置.txt"
self.WriteToTree()
#导入日常模式—数据
pass
    def buttonB2_Func(self):
self.num01 = 1
self.buttonB2['bg']='#71C671'
self.buttonA1['bg'] = '#D1EEEE'
print("效果生成 =1")
self.datatxt = "休息模式_保存配置.txt"
self.WriteToTree()
# 导入休息模式—数据
pass
    def Test(self):
print("纯测试")
def Belling(self):
self.num01 = 0  #日常模式0 休息模式1
        #currentDir = os.getcwd()
while True & self.run01==1:
if self.num01 == 0:
self.datatxt = "日常模式_保存配置.txt"
elif self.num01 == 1:
self.datatxt = "休息模式_保存配置.txt"
            f1 = open(os.getcwd() + r"\\" + self.datatxt, 'r')            contect = f1.readlines()
# contect = []
            # print(contect)
            f1.close()            t = time.localtime()            now = time.strftime(
"%H %M", t).split()
for i in contect:
print(i)
print("闹铃监测正在运行中...")                a = i.split(
',')
#print(a[1])  # 時間 06:20
                #print(a[3])  # 铃声 起床号.mp3
                h = a[1].replace('\'','').replace(' ','').split(':')
a2=h                a3=a[
3].replace('\'','').replace('\n','').replace(' ','')
a4=(currentDir+'\\'+a3)
if h[0] == now[0] and h[1] == now[1]:
print("时间到!")
#playsound(r'C:\Users\Jesse Eisenberg\PycharmProjects\Zidonghua\ZidonghuaExcel\一个闹铃.mp3')
                    #playsound(a4)
                    #playsound(currentDir + '\\' + a[3])
                    #采用playsound会报线程错误
                    a4='C:\\Users\\Jesse Eisenberg\\PycharmProjects\\Zidonghua\\ZidonghuaExcel\\一个闹铃.wav'
                    winsound.PlaySound(a4, winsound.SND_FILENAME)                    time.sleep(
56)
else:
#time.sleep(0.5)
continue
def mainpro():    windows = tkinter.Tk()    windows.title(
"打铃系统v1.0")    windows.geometry(
'1200x600')    windows.resizable(
0,0)  #禁止更改窗口大小
    app = Application(windows)    app.creatTree()    app.creatThings()    app.Gui_arrange()    app.Test()
def looppro():        app.Belling()    threadObj01 = threading.Thread(
target=looppro)    threadObj01.start()    windows.mainloop()    sys.exit()currentDir=os.getcwd()
print("os.getcwd()=%s" % os.getcwd())
if __name__ == '__main__':
print("game starts")    mainpro()
print("game ends")
#开始之后,闹铃检测程序自动启动,点击“停止”圆框选项后,闹铃检测程序停止,在按“启动”圆框选项,程序并未启动

到此这篇关于如何用python GUI(tkinter)写一个闹铃小程序(思路详解)的文章就介绍到这了,更多相关python 闹铃小程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3.6 tkinter实现屏保小程序

    本文实例为大家分享了python3.6 tkinter实现屏保小程序,供大家参考,具体内容如下 该小程序是在闲着没事的时候,随便写的,就当打发无聊了. 该程序是用python3.6写的,调用了python中的tkinter的库(*python2x与python3x的thinter有很多不同的地方,一定要特别注意!!!) from random import randint from tkinter import * class Randball(): def __init__(self,canv

  • 基于python tkinter的点名小程序功能的实例代码

    代码如下所示: import datetime import json import os import random import tkinter as tk import openpyxl # 花名册文件名 excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx # 工作表名 excel_sheet = "Sheet1" # 记录存储文件名 file_path = "name_record.json"

  • 如何用python GUI(tkinter)写一个闹铃小程序(思路详解)

    事情的起因是帮助一个朋友写一个程序,来控制他们单位的铃声,平时竟然是手动打铃(阔怕) 事情的第一步:理清思路.需要用到python的几个知识:1.tkinter一些函数控件,2.控件和函数之间的联系(主用TreeView控件),3.读写数据入txt文档(高级版可换为数据库),4.数据的类的封装. 需要其他方面的知识:1.简单设计界面布局,2.确保程序易于使用的不反人类细节. 考虑清楚后,那么我开始学习一下相关知识. (1)python中作为面向对象的一份子,Class(类)和Instance(实

  • Python爬虫+tkinter界面实现历史天气查询的思路详解

    今天给大家分享用Python 爬虫+tkinter界面来实现历史天气查询. 一.实现效果 运行效果 运行效果如下: 二.基本思路 导入用到的库 import requests from lxml import etree import re import tkinter as tk from PIL import Image, ImageTk from xpinyin import Pinyin 1. 爬虫部分 目标url:https://lishi.tianqi.com/ 该网站提供了全国34

  • python基于Kivy写一个图形桌面时钟程序

    Kivy 是一个开源的 Python 第三方库,可以用来快速开发应用程序. 它有如下三个特点: 跨平台 Kivy 编写的程序可在 Linux,Windows,OS X,Android,iOS 和 Raspberry Pi 上运行. 商业友好 Kivy 基于 MIT 许可证进行开源,可以进行免费的商业使用. GPU 加速 Kivy 的图像引擎基于 Open ES 2 构建,性能出众. 除此之外 Kivy 也存在一些缺点,比如: 非原生的图形界面: 打包后的体积很大: 缺乏社区支持: 缺乏足够的示例

  • python 写一个文件分发小程序

    一.概述 该小程序实现从源端到目标端的文件一键拷贝,源端和目标段都在一台电脑上面,只是目录不同而已 二.参数文件说明 1. settings.txt的说明 a. 通过配置settings.txt,填源端和目标端路径,如果用反斜杠结尾表示填的是文件夹,如果不是反斜杠结尾则代表填的是文件 b. 如果是按日期自动生成的文件夹,则用{YYYYMMMDD}或{MMDD}等替代 c. 文件支持*匹配任意名字 d. 在no_create_ok_file组中,表示不生成ok标识,在create_ok_file组

  • 用Python从0开始实现一个中文拼音输入法的思路详解

    众所周知,中文输入法是一个历史悠久的问题,但也实在是个繁琐的活,不知道这是不是网上很少有人分享中文拼音输入法的原因,接着这次NLP Project的机会,我觉得实现一发中文拼音输入法,看看水有多深,结果发现还挺深的,但是基本效果还是能出来的,而且看别的组都做得挺好的,这次就分 享一下我们做的结果吧. (注:此文假设读者已经具备一些隐马尔可夫模型的知识) 任务描述 实现一个中文拼音输入法. 经过分析,分为以下几个模块来对中文拼音输入法进行实现: 核心功能包括拼音切分(SplitPinyin.py)

  • 结合Python网络爬虫做一个今日新闻小程序

    核心代码 requests.get 下载html网页 bs4.BeautifulSoup 分析html内容 from requests import get from bs4 import BeautifulSoup as bs from datetime import datetime as dt def Today(style=1): date = dt.today() if style!=1: return f'{date.month}月{date.day}日' return f'{dat

  • python 基于opencv 实现一个鼠标绘图小程序

    需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆或矩形:需要定义一个画图的模式mode 左键单击.移动.释放:需要捕获三个不同的事件 开始画图,结束画图:需要定义一个画图的标记位drawing 实现代码 import cv2 as cv import numpy as np drawing = False # 是否开始画图 mode = True

  • 使用Python下载抖音各大V视频的思路详解

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Python七号 ,作者 somenzz Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space.bilibili.com/523606542 上次写了用 Python 批量下载知乎视频的方式,这次分享用 Python 批量下载抖音个人主页的全部无水印视频,本文重点不是提供一个好用的脚本,而是讲述如何写出这样的脚本,正所谓授人以鱼,不如授人

  • Python Flask 搭建微信小程序后台详解

    前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个人觉得的微信小程序与后台的交互有点像ajax,所以有ajax开发经验的同学开发小程序应该很容易上手,因为本文着重讲解后台程序的搭建,所以,微信小程序的前端开发将一笔带过,有兴趣学习小程序前端语言的同学可移步网易云课堂的一套快速入门课程<轻松玩转微信小程序>. 分三步讲解微信小程序与Python后台

  • python脚本调用iftop 统计业务应用流量的思路详解

    因公司服务器上部署应用较多,在有大并发访问.业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用python调用iftop命令来获取应用进程流量,结合zabbix,可帮助定位分析问题.,以下是脚本内容,大概思路是: 利用iftop命令 iftop -t -P -N -n -s 2 来获取流量信息 对获取的流量信息进行处理,单位换算,同一个应用程序的所有链接流量进行合计(因为一个应用会有很多链接,每一个链接都有流量,全部相加即可得出这个应用的总流量) #

随机推荐