我用Python+PySide6做了个图形化番茄钟,这下可以提醒自己放松一下了。


本项目是Python&PySide6构建的番茄钟软件,这是我的第一个独立项目。

总览

在学习完Python的入门和进阶教程后,我认为我需要用项目来巩固已学内容,制作实用软件能够有效的提高我的编程能力。
在开始项目前,我构建了该项目的思维导图,打算以此分步骤实现各功能,思维导图如下:

j8WxRP.png

软件运行时界面如下:

j8fZR0.png

当前版本未实现功能

  • 读写配置文件
  • 休息时长自定义
  • 显示番茄次数

开发过程时的反馈

第一版完成反馈:
实现了最基础的定时功能,但是使用的是sleep指令,在这期间程序没办法进行其他操作,同时需要实现时间倒计时、多线程、界面、配置文件储存等功能。现在开始学习PyQt实现图形化界面。
第二版完成反馈:
基本完成了番茄钟核心功能,实现了多线程执行倒计时,Qt实现GUI,基本逻辑漏洞都已修补完毕。待添加功能:界面美化、设置界面、配置文件储存、记录番茄次数、小憩休息功能。

项目依赖

Python 3.7+
Pyside6(pip install pyside6)
Qt material(pip install qt_material)
Playsound(pip install playsound)

我的想法

这是我第一次独立编写项目,代码可能不是那么好,在处理线程时还遇到了不知道怎么停止线程的情况,搜索了几次之后,我发现给线程添加一个标识符并在循环流程中一直判断,是比较有效的办法。
我是一个新手,代码的编写规范也都是从论坛里东拼西凑学习的,还希望各位能给我一些指导或者建议!
完整版的源代码在Hub上搜索Pomorodo-timer-GUI就可以找到了,有音频资源和UI布局资源。

源代码

from PySide6.QtWidgets import QApplication
from PySide6.QtUiTools import QUiLoader
from PySide6.QtGui import QIcon
from qt_material import apply_stylesheet
from time import sleep
from threading import Thread
from playsound import playsound
from settings import TSettings

class Tomato():
    m_focustime = 0
    m_resttime = 5
    status_flag = False
    ts = TSettings()
    
    def __init__(self):
        self.BindEvents()

    def BindEvents(self):
        
        self.window = QUiLoader().load(self.ts.dir_ui)
        self.window.setFixedSize(self.window.width(),self.window.height())
        self.window.start.clicked.connect(self.StartFocus)
        self.window.reset.clicked.connect(self.ResetTime)
        self.window.reset.setProperty('class','warning')
        self.window.timedial.valueChanged.connect(self.SetTime)
              
    def ClockThread(self):
            while self.status_flag == True:
                self.isZero() 
                for i in range(self.m_focustime):
                    if self.status_flag:
                        sleep(60)    #休眠时长
                        self.CountDown()
                    else:
                        pass

    def isZero(self):
        if self.window.timedial.value() == 0:
            self.status_flag = False
            self.window.start.setText(self.ts.button_text[1])
            self.StopFocus()
            
            
    def CountDown(self):
        if self.window.timedial.value() >= 0 and self.window.timedial.value() < 10:
            self.window.timelabel.setText(self.ts.time[1].format(int(self.window.timelabel.text()[-1]) - 1))
            self.window.timedial.setValue(self.window.timedial.value() - 1)
        elif self.window.timedial.value() < 60:
            self.window.timelabel.setText(self.ts.time[2].format(int(self.window.timelabel.text()[-2:]) - 1))
            self.window.timedial.setValue(self.window.timedial.value() - 1)
        elif self.window.timedial.value() == 60:
            self.window.timelabel.setText(self.ts.time[4])
            self.window.timelabel.setText(self.ts.time[2].format(int(self.window.timelabel.text()[-2:]) - 1))
            self.window.timedial.setValue(self.window.timedial.value() - 1)

    def StartFocus(self):
        if self.status_flag == False:
            self.status_flag = True
            self.window.start.setText(self.ts.button_text[0])
            thread_clock = Thread(target = self.ClockThread)
            thread_clock.start()
            
        else:
            self.StopThread()
            self.window.start.setText(self.ts.button_text[1])
            self.isZero() 
        
    def StopFocus(self):
        thread_music = Thread(target=self.Music)
        thread_music.start()
    
    def StopThread(self):
        self.status_flag = False

    def ResetTime(self): 
        self.StopThread()
        self.window.timedial.setValue(0)
        self.window.timelabel.setText(self.ts.time[0])
    
    def SetTime(self):
        if self.window.timedial.value() < 10:
            self.window.timelabel.setText(self.ts.time[1].format(self.window.timedial.value()))
            self.m_focustime = self.window.timedial.value()
                    
        elif self.window.timedial.value() <60:
            self.window.timelabel.setText(self.ts.time[2].format(self.window.timedial.value()))
            self.m_focustime = self.window.timedial.value()
            
        elif self.window.timedial.value() == 60:
            self.window.timelabel.setText(self.ts.time[3])
            self.m_focustime = self.window.timedial.value()
     
    def Music(self):
        playsound(self.ts.dir_music)       


def main():
    app = QApplication([])
    app.setWindowIcon(QIcon('./ui/logo.png'))
    
    tomato = Tomato()
    ts = TSettings()
    apply_stylesheet(app,
                     theme=ts.theme,invert_secondary=False,
                     extra=ts.style_extra)
    
    tomato.window.show()
    app.exec()
    
    
if __name__ == '__main__':
    main()        
Python中使用PySide6实现读取文件时的环形进度条,可以按照以下步骤进行操作: 1. 首先,确保已经安装了PySide6库。可以使用以下命令进行安装: ```shell pip install PySide6 ``` 2. 创建一个Python脚本,并导入必要的模块: ```python from PySide6.QtWidgets import QApplication, QMainWindow, QProgressBar from PySide6.QtCore import Qt, QThread, Signal ``` 3. 创建一个自定义的线程类,用于模拟文件读取的进度: ```python class FileReadThread(QThread): progressChanged = Signal(int) def run(self): total_size = 1000 # 假设文件总大小为1000 for i in range(total_size): self.progressChanged.emit(i) self.msleep(10) # 模拟读取文件的延迟 ``` 4. 创建一个主窗口类,并在其中添加一个环形进度条: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("文件读取进度") self.resize(300, 200) self.progress_bar = QProgressBar(self) self.progress_bar.setGeometry(50, 50, 200, 200) self.progress_bar.setRange(0, 1000) # 设置进度条的范围 self.file_read_thread = FileReadThread() self.file_read_thread.progressChanged.connect(self.update_progress) self.file_read_thread.start() def update_progress(self, value): self.progress_bar.setValue(value) ``` 5. 创建一个应用程序对象,并运行主窗口: ```python app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 这样,当运行该脚本时,会显示一个带有环形进度条的窗口,进度条会模拟文件读取的进度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值