Python Code Notes

Information by python engineer

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

以前作成した「pyperclip」を用いたワードクリップアプリを改造して、ショートカットアプリを作成していきます。

  • ワードクリップアプリ

今回は、上記のワードクリップ機能に加えて、登録されたurlをブラウザで開くショートカット機能を追加します。

目次

アプリ概要

以下に、作成したアプリの外観を示します。

f:id:vigilantPotato:20190324145542j:plain

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

ボタンをクリックすると、それぞれに登録されたurlをブラウザで開きます。

例えば、「WSJ」をクリックしてみると、自動でwebブラウザが立ち上がり、Wall Street Journalのトップページを開きます。

f:id:vigilantPotato:20190324145927j:plain

また、以前作成したワードクリップ機能も生きているため、適当なところにペーストすると、正式名称である「THE WALL STREET JOURNAL.」が貼り付けられます。

f:id:vigilantPotato:20190324150810j:plain

web上だけでなく、PC内のフォルダへのショートカットとしても使用できます。

一番下の「Files」ボタンには、「C:\Program Files」フォルダが登録されており、クリックするとエクスプローラでそのフォルダを開いてくれます。

f:id:vigilantPotato:20190324151148j:plain

特定のwebサイトを開くために、「ブラウザを開く→お気に入りを開く→クリックする」という一連の作業が、ワンクリックで完結するので、使ってみると非常に便利です。

また、PC内のフォルダへのショートカットも一緒に表示できるので、デスクトップ上がかなりすっきりします。

webサイトへのログインパスワードやidを自動でクリップボードにコピーするように設定すれば、煩わしい入力作業が不要になります。(セキュリティー面で不安はありますが。)

コードの解説

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

使用するのは、前回使用した「pyperclip」と「tkinter」の二つに加えて、「webbrowser」を使用します。

「webbrowser」はデフォルトでインストールされているモジュールです。

import pyperclip
import tkinter
import webbrowser

次に、ボタンをクリックすると登録されたurlをブラウザで開く、「ShortCutButton」クラスを作成していきます。

tkinterのButtonクラスを継承し、上書きすることで、urlをブラウザで開く機能を追加します。

クラスやメソッドの名称を修正していますが、基本的には以前作成したワードクリップアプリと同じ構造で、文字列のコピー機能も残してあります。

class ShortCutButton(tkinter.Button):   #1
    '''
    登録したurlをブラウザで開くボタンを生成
    clipwordを登録すると、登録した文字をクリップボードにコピー(任意)
    '''

    def __init__(self, title,  url, clipword=None, master=None):    #2
        super().__init__(master, width=15, text=title, command=self.button_clicked) #3
        self.url = url  #4
        self.clipword = clipword    #5

    def button_clicked(self):   #6
        if self.clipword:
            pyperclip.copy(self.clipword)   #7

        if self.url:
            webbrowser.open(self.url)   #8

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

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

  1. tkinterのButtonクラスを継承した「ShortCutButton」クラス
  2. ボタンに表示させるタイトル、ブラウザで開くurl、コピーする文字列を引数にとる(コピーする文字列は省略可)
  3. commandオプションでクリック時にbutton_clickedメソッドを実行するように設定
  4. urlをインスタンス変数に設定
  5. clipwordをインスタンス変数に設定
  6. ボタンクリック時に実行されるメソッド
  7. clipwordが入力されている場合、クリップボードにコピー
  8. urlが入力されている場合、ブラウザでurlを開く

3では、super関数を用いて継承元であるtkinterのButtonクラスのtextオプションとcommandオプションの設定をしています。 super関数については、こちらを参照してください。

8では、「webbrowser」モジュールを用いてurlを開いています。webbrowser.open(url)とするだけで、自動でデフォルトのブラウザを用いてurlを開いてくれます。

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

if __name__ == '__main__':
    #1
    word_list = [
        ["NBA", "https://www.sportingnews.com/jp/nba", "National Bascketball America"],
        ["NTT", "http://www.ntt.co.jp/", "日本電信電話株式会社"],
        ["WSJ", "https://www.wsj.com/", "THE WALL STREET JOURNAL."],
        ["Files", "C:\Program Files"],
    ]

    #2
    root = tkinter.Tk()
    for info in word_list:
        button = ShortCutButton(*info)
        button.pack()
    root.mainloop()
  1. ボタン設定のためのリスト
  2. for文でボタンを生成

2ではfor文を用いてリストの内容のボタンを生成しています。タイトル、url、コピーする文字列の3つの引数を、ShortCutButton(*info)で一括で渡しています。

コード全文

import pyperclip
import tkinter
import webbrowser


class ShortCutButton(tkinter.Button):
    '''
    登録したurlをブラウザで開くボタンを生成
    clipwordを登録すると、登録した文字をクリップボードにコピー(任意)
    '''

    def __init__(self, title,  url, clipword=None, master=None):
        super().__init__(master, width=15, text=title, command=self.button_clicked)
        self.url = url
        self.clipword = clipword

    
    def button_clicked(self):
        if self.clipword:
            pyperclip.copy(self.clipword)   #clipwordをコピー

        if self.url:
            webbrowser.open(self.url)   #urlをブラウザで開く


if __name__ == '__main__':
    #ボタン、url、コピーする文字列のリスト
    word_list = [
        ["NBA", "https://www.sportingnews.com/jp/nba", "National Bascketball America"],
        ["NTT", "http://www.ntt.co.jp/", "日本電信電話株式会社"],
        ["WSJ", "https://www.wsj.com/", "THE WALL STREET JOURNAL."],
        ["Files", "C:\Program Files"],
    ]

    #ボタンを生成
    root = tkinter.Tk()
    for info in word_list:
        button = ShortCutButton(*info)
        button.pack()
    root.mainloop()