Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

PyQt5を使って手探りでツイッタークライアントを作る vol.2

前回はGUI部分を作りました。今回はロジック部分...と行きたかったのですが、その前に一度前回のコードをリファクタリングしておきます。

どこがまずかったのか

ずばりtextboxやbuttonが外に出てるところです。今後ウィジェットはもっともっと増えていきます。だから、このままではスパゲッティとなります。

タイムラインを表示するウィンドウ、プロフィールを表示するウィンドウ、それぞれがウィジェットを外で置いていくと考えるだけで恐ろしいですね...

オリジナルのウィンドウを作る

スパゲッティを回避するには、まずQWidgetを継承したクラスを作ります。そのクラスがinit内でtextboxやbuttonを自身に配置すれば解決できます。

class TweetWindow(QWidget):
    def __init__(self, parent = None):
        super(TweetWindow, self).__init__(parent)
        textbox = QPlainTextEdit()
        button = QPushButton()
        button.setText('tweet')

        layout = QVBoxLayout()
        layout.addWidget(textbox)
        layout.addWidget(button)

        self.setLayout(layout)

こんな感じです。実にシンプルですね。

TweetWindow内でレイアウトを決めたら汎用性を失うのではないかと不安に思うかもしれません。しかし、そもそもTweetWindowに汎用性は必要ありません。これでOKです。

さらに分ける

init内ではレイアウト部分の初期化のみを行うわけではありません。だから、ここも切り出しておきましょう。

class TweetWindow(QWidget):
    def __init__(self, parent = None):
        super(TweetWindow, self).__init__(parent)
        self.initLayout()
    def initLayout(self):
        textbox = QPlainTextEdit()
        button = QPushButton()
        button.setText('tweet')

        layout = QVBoxLayout()
        layout.addWidget(textbox)
        layout.addWidget(button)

        self.setLayout(layout)

リファクタリング後

そんなわけでリファクタリングしたコードがこんな感じです。すっきりシンプルでわかりやすくなりましたね。どういった処理をしているのかもパッと見てよくわかります。

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

class TweetWindow(QWidget):
    def __init__(self, parent = None):
        super(TweetWindow, self).__init__(parent)
        self.initLayout()
    def initLayout(self):
        textbox = QPlainTextEdit()
        button = QPushButton()
        button.setText('tweet')

        layout = QVBoxLayout()
        layout.addWidget(textbox)
        layout.addWidget(button)

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = TweetWindow()

    window.show()
    sys.exit(app.exec_())

次回予告

次回はいよいよツイートロジックを作っていきます。といってもtweepyつかうだけなので簡単です。