maya PySide ボタンからコマンドを実行してみよう

pyside-buttoncommand GUI作成

こんにちは!ビーバー@ゲーム業界歴約20年python勉強中 です。
maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

PySideでGUI作成を学習しようとすると、
突然クラスやら知らない用語が大量に出てきて、、、とても難しそうに感じますよね。

PySideでGUIをつくってみよう」のシリーズ記事では、
PySideを使うはじめの一歩を、用語の説明もいれながら詳しく解説していきます。
私がPySideを勉強しながらわかったことをまとめていくので、
初心者の方にも理解しやすい内容になっていると思います。

このチュートリアルでわかること
  • ボタンにいろんな機能をひもづける方法
  • PySideで作ったウィンドウをmayaの子どもにする方法

それではGO☆

※今回の内容は、こちらの書籍を参考に書いています。

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。

このチュートリアルでやること

  • ウィンドウのボタンを押すと「押したよ!」と出力される
  • ボタンを押すと、ウィンドウが閉じるようにする
  • ボタンを押して、メモ帳を起動する
  • PySideで作ったウィンドウをmayaの子どもにする

maya2020、PySide2を使う前提で解説していきます。

ボタンを押すと「押したよ!」と出力する

ボタンつきウィンドウを作り、
ボタンを押すと「押したよ!」と表示されるスクリプトを作ってみましょう。

from PySide2.QtWidgets import QMainWindow,QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle(u"はじめてのウィンドウ")

        button = QPushButton(u"押してね!")
        self.setCentralWidget(button)

        button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print(u"押したよ!")
       
        
window = MainWindow()
window.show()

このスクリプトを実行すると、ボタンつきウィンドウが出ます。

ボタンを押すと、スクリプトエディタのヒストリに「押したよ!」と表示されます。

スクリプトを解説していきます。
11~14行目が、ボタンの押下とテキスト出力をひもづけている部分です。

         button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print(u"押したよ!")

ボタンを押すと「押したよ!」と表示される、のように、
「〇〇すると、〇〇する」という仕組みはどのように実現するのでしょうか?

PySideでは「シグナルとスロット」という機能を使います。

ウィンドウを作成する方法の解説を読みたい方はこちら
>> maya PySide はじめてのウィンドウ作成

シグナルとスロット

シグナルとは、「何かがおこったとき」を取得して通知をする機能です。
一方、スロットはシグナルを受け取り、任意の関数を実行します。

シグナルとスロットは11行目にあります。

        button.clicked.connect(self.the_button_was_clicked)

.clickedが、シグナルで、.connectが、スロットです。
実行したい関数は、カッコの中に指定します。(self.the_button_was_clicked)

the_button_was_clicked関数は、13、14行目で定義しています。

    def the_button_was_clicked(self):
        print(u"押したよ!")

実行すると、「押したよ!」とテキスト出力する、シンプルな関数です。

ピヨちゃん
ピヨちゃん

ちょっと気になってるんだけど、
def the_button_was_clicked(self):

こういうところでちょこちょこ出てきてる、selfってのは何だい?

ハムちゃん
ハムちゃん

selfは、クラスの中で関数を呼び出したり、定義したりするときに必要なものなんだよ!

>>selfについて知りたい方はこちら → selfってなあに?

>> selfがわかりにくかった人は、クラスについて学習してみよう!
【maya python GUI】クラスってなあに?その1
【maya python GUI】クラスってなあに?その2
【maya python GUI】クラスってなあに?その3

話をもどして、

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle(u"はじめてのウィンドウ")

        button = QPushButton(u"押してね!")
        self.setCentralWidget(button)

        button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print(u"押したよ!")

スクリプトの中でやっていることは以下です。

  • MainWindowクラス というウィンドウの設計書を作る
    ➝PySideのQMainWindowという機能を利用する
    ➝ウィンドウ名を「はじめてのウィンドウ」にする
    ➝「押してねボタン」をウィンドウの中央に配置
    ➝ボタンをクリックすると、the_button_was_clicked関数を実行する
    ➝関数は、「押したよ!」とテキスト出力するものである

この設計書にもとづいて、ウィンドウを生成します。

window = MainWindow()
window.show()
ピヨちゃん
ピヨちゃん

おおー!これでボタンを押すとテキストが出るようにできるんだね!

ハムちゃん
ハムちゃん

テキストを出力する部分を、自分の好きな機能に書きかえると
いろんなことができるよ!

ボタンでウィンドウを閉じる

応用の例として、ボタンを押すとウィンドウを閉じるようにしてみましょう。

from PySide2.QtWidgets import QMainWindow,QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle(u"はじめてのウィンドウ")
        button = QPushButton(u"押してね!")
        self.setCentralWidget(button)
        
        button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print(u"押したよ!")
        window.destroy()
        
window = MainWindow()
window.show()

14行目にウィンドウを閉じる処理 window.destroy() をつけ足してみました。
関数にお好みの機能を入れることで、
ボタンに様々な機能をつけることができます。

ボタンでメモ帳を起動する

2つめの例です。ボタンを押すとメモ帳を起動するなんてこともできます。
ほかのプログラムを実行するには、pythonの subprocessモジュール(機能)を利用します。

import subprocess
from PySide2.QtWidgets import QMainWindow,QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle(u"はじめてのウィンドウ")
        button = QPushButton(u"メモ帳を起動")
        self.setCentralWidget(button)
        
        button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        subprocess.Popen('C:/Windows/notepad.exe')
        
window = MainWindow()
window.show()

1行目でsubprocessモジュールを読みこみ、
14行目、メモ帳のexeファイルパスを指定しています。
Popen関数は、指定パスのプログラムを実行する関数です。

ピヨちゃん
ピヨちゃん

the_button_was_clicked関数の中にメモ帳を開く処理を書いたから、

ウィンドウのボタンを押すとメモ帳が開くようになるんだね。

ハムちゃん
ハムちゃん

mayaの機能をボタンにつけてもいいし、夢が広がるね!

PySideで作ったウィンドウをmayaの子どもにする

最後に、PySideで作ったウィンドウをmayaの子どもにする方法を見ていきましょう。

今まで作ったウィンドウは、
mayaメインウィンドウをクリックすると、mayaの後ろ側に行ってしまいました。

図のように、「うしろに行かないウィンドウ」にしてみましょう!

from PySide2.QtWidgets import QMainWindow,QPushButton
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin

class MainWindow(MayaQWidgetBaseMixin,QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle(u"はじめてのウィンドウ")
        button = QPushButton(u"とじる")
        self.setCentralWidget(button)
        
        button.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        window.destroy()
        
window = MainWindow()
window.show()

maya.app.general.mayaMixin という機能群の MayaQWidgetBaseMixin を使います。
4行目のように、クラスの第1引数(カッコの中に最初に書く)として指定すると、
作成されるウィンドウがmayaの子どもとして認識されます。

ピヨちゃん
ピヨちゃん

あれ?意外と簡単だったなあ。。

ハムちゃん
ハムちゃん

難しそうな機能は、ごくシンプルな構成でためしてみよう。
分かりやすくなるよ!

まとめ

今回は、PySideで作ったボタンにいろんな機能をつけてみました。
シグナル&スロットはPySideの鬼門ともいわれていて、少し難しく感じたかもしれません。
ほかにも、どんな機能があるのかな?と思われた方もいらっしゃるのではないでしょうか?

私がPySideを勉強していて、一番良かった本のリンクを貼っておきますのでよければ見てみて下さい。
シグナル&スロットの機能の詳しい解説や、いろんなサンプルが紹介されています。

また、このサイトのGUI作成ページでは、
初心者向けのチュートリアル&学習情報をまとめていますので、ぜひ見てみてくださいね!

maya pythonでGUIを作ろう!

maya pythonでGUIを作る方法をもっと知りたい方はこちら。

cmdsで作る方法・PySideの紹介・PySideのかんたんなチュートリアルをまとめています。
PySideを使うときに必要になる、「クラス」についても徹底解説!

コメント

タイトルとURLをコピーしました