在Python中为Ubuntu构建pomodoro计时器
#教程 #生产率 #python #ubuntu

我必须在我的个人机器上安装Ubuntu,并花一些时间进行技巧。我了解了Pomodoro技术以更好的时间管理,并意识到需要Ubuntu的应用程序,因为没有一个应用程序提供我想要的功能。

因此,该项目启动了,其alpha版本中的完整组件在这里:https://abpanic.github.io/PomodoroTimer/
在这篇博客文章中,我将讨论为我的用例创建的自定义Pomodoro计时器的构建过程。让我们研究细节。

构建过程

安装先决条件

Visual Studio代码

我首先在Visual Studio代码中使用文件名“ Pomodorotimer.py”创建一个新文件,并添加了初始脚手架以概述应用程序的主要组件。起动代码看起来像这样:

import tkinter as tk

class PomodoroTimer:
    def __init__(self, master):
        self.master = master
        master.title("Pomodoro Timer")

        # Create timer label
        self.timer_label = tk.Label(master, text="00:00", font=("Arial", 48))
        self.timer_label.pack(pady=50)

        # Create timer control buttons
        self.start_button = tk.Button(master, text="Start", command=self.start_timer)
        self.start_button.pack(side="left", padx=10)

        self.pause_button = tk.Button(master, text="Pause", command=self.pause_timer, state="disabled")
        self.pause_button.pack(side="left", padx=10)

        self.stop_button = tk.Button(master, text="Stop", command=self.stop_timer, state="disabled")
        self.stop_button.pack(side="left", padx=10)

    def start_timer(self):
        pass

    def pause_timer(self):
        pass

    def stop_timer(self):
        pass

root = tk.Tk()
app = PomodoroTimer(root)
root.mainloop()

启动器代码只是应用程序的脚手架,可以在第一个GO中使用所有功能编码的所有组件。但是,在VSCODE中运行启动代码应该启动该应用程序,因为我们开始启动,并且应该像以前一样启动。

接下来,我添加了其余的代码组件,以确保应用程序功能正常并执行应有的任务。如您所见,暂停和停止计时器功能缺少,应用程序的计时器和状态也是如此。我们还添加了倒计时和计时器标签

import tkinter as tk    
class PomodoroTimer:    
    def __init__(self, master): 
        ...//code here remains the same 
        master.title("Pomodoro Timer")  
        self.seconds_left = 25 * 60  # 25 minutes   
        self.is_running = False 
        ...//code here remains the same     
    def countdown(self):    
        if self.seconds_left > 0 and self.is_running:   
            self.seconds_left -= 1  
            self.update_timer_label()   
            self.master.after(1000, self.countdown)  # Call this method again after 1000 ms (1 second)  
    def update_timer_label(self):   
        minutes, seconds = divmod(self.seconds_left, 60)    
        self.timer_label.configure(text=f"{minutes:02d}:{seconds:02d}") 
    def start_timer(self):  
        if not self.is_running: 
            self.is_running = True  
            self.start_button.config(state="disabled")  
            self.pause_button.config(state="normal")    
            self.stop_button.config(state="normal") 
            self.countdown()    
    def pause_timer(self):  
        if self.is_running: 
            self.is_running = False 
            self.start_button.config(state="normal")    
            self.pause_button.config(state="disabled")  
    def stop_timer(self):   
        if self.is_running or self.seconds_left != 25 * 60: 
            self.is_running = False 
            self.seconds_left = 25 * 60 
            self.update_timer_label()   
            self.start_button.config(state="normal")    
            self.pause_button.config(state="disabled")  
            self.stop_button.config(state="disabled")   
if __name__ == "__main__":  
    root = tk.Tk()  
    ...//code here remains the same 

现在,应用程序的出现很好,我们可以使用python3 PomodoroTimer.py从终端运行。

应用程序启动,计时器启动。但是,最低可行产品(MVP)应具有超出基本功能的功能。它应该在初始阶段中包含使用户想要更多使用的功能。

因此,我专注于两个独特功能,将其与Ubuntu Snap Store中可用的其他Pomodoro计时器区分开来:

  1. 用户可以听到的警报声音,允许他们重置计时器。
  2. 可以双击Ubuntu启动应用程序的能力。

要实现这些功能,我进行了以下更改:

添加警报声音

我使用pygame库来添加警报声音功能:

import tkinter as tk
import pygame

class PomodoroTimer:
    def __init__(self, master):
        ...//code here remains the same 

        pygame.mixer.init()

    def countdown(self):
        if self.seconds_left > 0 and self.is_running:
           ...//code here remains the same  
            self.master.after(1000, self.countdown)  # Call this method again after 1000 ms (1 second)
        elif self.is_running:
            self.play_alarm()

    ...//code here remains the same 

    def stop_timer(self):
        if self.is_running or self.seconds_left != 25 * 60:
            ...//code here remains the same 
            self.pause_button.config(state="disabled")
            self.stop_button.config(state="disabled")

    def play_alarm(self):
        pygame.mixer.music.load("alarm_sound.wav")  # Replace "alarm_sound.wav" with the path to your sound file
        pygame.mixer.music.play()

if __name__ == "__main__":
    root = tk.Tk()
    app = PomodoroTimer(root)
    root.mainloop()

通过双击Ubuntu使应用程序可执行

用双击Ubuntu使Python脚本可执行,我遵循以下步骤:

  1. 在脚本中添加Shebang行。 在文本编辑器中打开您的python脚本(pomodorotimer.py),然后将以下行添加到文件的顶部:
#!/usr/bin/env python3

此行告诉操作系统使用Python 3运行脚本。

保存并关闭文件。

  1. 使脚本可执行。 打开一个终端窗口并导航到脚本所在的目录。然后,运行以下命令:
chmod +x PomodoroTimer.py

此命令授予脚本可执行的权限。

  1. 将脚本与python解释器相关联。

    为了确保双击时使用Python打开脚本,您需要将.py文件与Python解释器相关联。为此,请按照以下步骤:

    A。右键单击pomodrotimer.py文件,然后从上下文菜单中选择“属性”。


    b。在“属性”窗口中,导航到“打开”选项卡。

    C。在应用程序列表中找到“ Python 3”解释器。如果您看不到它,请单击“显示其他应用程序”并在扩展列表中找到它。

    d。选择“ Python 3”,然后单击“设置为默认”按钮。

    双击脚本:现在您应该可以双击pomodorotimer.py文件以运行脚本。

  2. (可选)创建桌面快捷方式。

    右键单击桌面上,然后选择“在此处创建新的启动器”或“创建启动器”(措辞可能会根据您的Ubuntu版本而有所不同)。

    在“创建启动器”窗口中,填写详细信息:

    A。类型:从下拉菜单中选择“应用程序”。

    b。名称:输入快捷方式的名称,例如“ Pomodoro Timer”。

    C。命令:单击“浏览”按钮,然后导航到pomodorotimer.py文件的位置。选择文件,然后单击“打开”。

    d。 (可选)图标:单击图标占位符以选择快捷方式的图标。

    单击“确定”或“创建”以创建桌面快捷方式。

使用这些增强功能,现在是时候创建PILOT应用程序的分发版本了。

要将python脚本转换为debian软件包(.deb文件),我遵循以下步骤:

  1. 安装所需工具。 打开终端并运行以下命令以安装必要的工具:
sudo apt update
sudo apt install dh-python devscripts debhelper
  1. 为软件包创建目录结构。 用软件包的名称替换your_package_name,然后运行以下命令:
mkdir -p your_package_name/usr/src/your_package_name
mkdir -p your_package_name/usr/bin
mkdir -p your_package_name/debian

然后,将您的python脚本(pomodorotimer.py)移动到your_package_name/usr/src/your_package_name目录。

  1. 创建一个运行应用程序的脚本。 在your_package_name/usr/bin目录中,创建一个名为your_package_name的新文件(没有任何文件扩展名)。在此文件中,添加以下内容:
#!/bin/sh
/usr/bin/python3 /usr/src/your_package_name/PomodoroTimer.py

保存文件并通过运行:
使其可执行

chmod +x your_package_name/usr/bin/your_package_name
  1. 创建一个debian/control文件。 在your_package_name/debian目录中,创建一个名为Control的新文件。将以下内容添加到文件中,用您的包装详细信息替换占位符文本:
Source: your_package_name
Section: utils
Priority: optional
Maintainer: Your Name <your.email@example.com>
Build-Depends: debhelper (>=9), dh-python, python3
Standards-Version: 3.9.8

Package: your_package_name
Architecture: all
Pre-Depends: dpkg (>= 1.16.1), python3
Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}
Description: Short description of your package
 Long description of your package.
  1. 创建一个debian/rules文件。 在your_package_name/debian目录中,创建一个名为“规则”的新文件。将以下内容添加到文件:
#!/usr/bin/make -f

%:
    dh $@ --with python3 --buildsystem=pybuild --system=setuptools

保存文件并通过运行:
使其可执行

chmod +x your_package_name/debian/rules
  1. 创建一个debian/changelog文件。 将以下内容添加到文件中,用您的包装详细信息替换占位符文本:
your_package_name (1.0-1) unstable; urgency=low

  * Initial release.

 -- Your Name <your.email@example.com>  <current_date>

用格式替换为MON,DD MMM YYYY HH:MM:SS +ZZZZ。

  1. 创建setup.py文件。 在项目的根目录中创建一个setup.py文件,其中包含以下内容:
from setuptools import setup, find_packages

setup(
    name="pomodorotimer",
    version="1.0",
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'pomodorotimer=pomodorotimer:main',
        ],
    },
)

替换Pomodorotimer:Main用适当的模块和应用程序输入点的功能名称。

  1. 创建一个debian/compat文件。 创建一个新的文件,其中包括以下内容的Debian目录中的Compat:
10

这将兼容性级别设置为10,它应该与您使用的工具一起使用。

  1. 构建Debian软件包。 导航到终端中的your_package_name目录的根,并运行以下命令:
dpkg-buildpackage -us -uc

如果构建成功,则将在您的your_package_name文件夹的父目录中生成.deb文件。

现在,我有一个.deb文件,可以使用dpkg -i your_package_name.deb命令在基于debian的系统上分发和安装。