Python Code Notes

Information by python engineer

tkinterとpyperclipでデスクトップアプリを作成しよう(初心者向け) Python

Pythonを用いて、ボタンをクリックすると登録された文字列をクリップボードにコピーするアプリを作成していきます。

使用するモジュールは2つだけで、非常に短いコードで作成することができるのでかなり初心者向けです。

ボタン等、GUI作成には「tkinter」を使用し、文字列のクリップボードへのコピーには「pyperclip」を使用します。

目次

アプリ概要

作成したアプリの外観です。

f:id:vigilantPotato:20190323181428j:plain

3つのボタンが並べて表示されており、タイトルが「NBA」、「NTT」、「WSJ」となっています。

ボタンをクリックすると、タイトルになっている略語の正式名称がクリップボードにコピーされます。

例えば、「NTT」をクリックした後、適当なところへペーストしてみると、、、

f:id:vigilantPotato:20190323181454j:plain

上図の様に、「NTT」の正式名称である「日本電信電話株式会社」がペーストされました。

長い文字列を入力する機会が多い場合、辞書登録しておくよりもこのアプリを使った方が効率的な場合があります。

また、セキュリティー面で不安がありますが、パスワードを登録しておきけばワンクリックでクリップボードにパスワードをコピーすることができます。

コードの解説

まずは、使用するモジュールをインポートします。

使用するのは、「pyperclip」と「tkinter」の二つで、「pyperclip」は別途インストールしておく必要があります。

事前にpip install pyperclipを実行してインストールしておきましょう。

「tkinter」はデフォルトでインストールされているので不要です。

import pyperclip
import tkinter

次に、ボタンをクリックすると登録された文字列をクリップボードにコピーする、「ClipButton」クラスを作成していきます。

tkinterのButtonクラスを継承し、上書きすることでコピー機能を追加します。

class ClipButton(tkinter.Button): #1
    '''
    クリックで登録した文字をクリップボードにコピーするボタンを生成
    ボタンのタイトルと、クリップワードを引数にとる
    '''

    def __init__(self, title, clipword, master=None): #2
        super().__init__(master, width=15, text=title, command=self.clip_word) #3
        self.clipword = clipword
    
    def clip_word(self): #4
        pyperclip.copy(self.clipword)   #clipwordをクリップボードにコピー

以下、簡単な解説になります。

  1. tkinterのButtonクラスを継承した「ClipButton」クラス
  2. ボタンに表示させるタイトルとコピーする文字列を引数にとる
  3. commandオプションでクリック時にclip_wordメソッドを実行するように設定
  4. pyperclipを用いて登録された文字列をクリップボードへコピー

同じような機能を持つボタンを複数個作る場合は、このようにButtonクラスを上書きしたクラスを作成し、メソッドを追加するとコードが見やすくなります。

3では、super関数を用いて継承元であるtkinterのButtonクラスのtextオプションとcommandオプションの設定をしています。

最後に、「ClipButton」クラスを用いて、ボタンを作成していけば完成です。

if __name__ == '__main__':
    #クリップボタンとタイトルとコピーする文字列のリスト
    word_list = [
        ["NBA", "National Bascketball America"],
        ["NTT", "日本電信電話株式会社"],
        ["WSJ", "THE WALL STREET JOURNAL."],
    ]

    #クリップボタンを生成
    root = tkinter.Tk()
    for clipword in word_list:
        button = ClipButton(clipword[0], clipword[1])
        button.pack()
    root.mainloop()

ボタンのタイトルとコピーする文字列はリスト化して、for文を用いてボタンを生成しています。

こうすることでコードが簡潔になり、後からのボタンの追加も非常に簡単になります。

コード全文

import pyperclip
import tkinter


class ClipButton(tkinter.Button):
    '''
    クリックで登録した文字をクリップボードにコピーするボタンを生成
    ボタンのタイトルと、クリップワードを引数にとる
    '''

    def __init__(self, title, clipword, master=None):
        super().__init__(master, width=15, text=title, command=self.clip_word)
        self.clipword = clipword
    
    def clip_word(self):
        pyperclip.copy(self.clipword)   #clipwordをクリップボードにコピー


if __name__ == '__main__':
    #クリップボタンとタイトルとコピーする文字列のリスト
    word_list = [
        ["NBA", "National Bascketball America"],
        ["NTT", "日本電信電話株式会社"],
        ["WSJ", "THE WALL STREET JOURNAL."],
    ]

    #クリップボタンを生成
    root = tkinter.Tk()
    for clipword in word_list:
        button = ClipButton(clipword[0], clipword[1])
        button.pack()
    root.mainloop()