見出し画像

ウィンドウが縮む問題:一応解決

(Python学習初心者の試行錯誤・備忘録です)
前回

で解決できていなかった「ウィンドウが縮む問題」についてです。
PySimpleGUIで作ったコントロールウィンドウから、matplotlibのグラフを別ウィンドウで表示すると、グラフ表示は正常だが、「コントロールウィンドウのほうが」縮むという奇妙な現象です。

再現コード

まず問題を再現する単純なコードを書いてみました

import PySimpleGUI as sg
import matplotlib.pyplot as plt

def graph_show():
    plt.title("グラフ", fontname="MS Gothic")
    plt.show()

layout = [
    [sg.Text("コントロール",size=(40,1))],
    [sg.Button("show")]
]

window = sg.Window("PySimpleGUI-matplotlib連携テスト",layout)

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED :
        break
    elif event == "show":
        graph_show()
window.close()

・PySimpleGUIで"show" というボタンのあるコントロールウィンドウが開きます。

・show をクリックすると別ウィンドウでグラフ表示する。(中身なし)

ここまでは期待通りだけれども、このとき同時に、コントロールのウィンドウの方が小さくなり、タイトルバーや左上のアイコンが消えてしまいます。

(小さくなっても、一応使えるからいいんですけどね。)

試行錯誤1

コントロールのwindow を再描画すればいいんじゃない?
redrawボタンをつけて

    elif event == "redraw":
        window.close()
        window = sg.Window("PySimpleGUI-matplotlib連携テスト",layout)

クリックしたら再描画する、ようにしたら怒られました。

レイアウトの変数は使い捨て(?)みたいなので、もう一度ちゃんと書く必要があるらしい。ならば、layoutの設定を関数の中に押し込んでみます。

試行錯誤2

import PySimpleGUI as sg
import matplotlib.pyplot as plt

def graph_show():
    plt.title("グラフ", fontname="MS Gothic")
    plt.show()

def make_mainwindow():
    layout = [
        [sg.Text("コントロール",size=(40,1))],
        [sg.Button("show"),sg.Button("redraw")]
    ]
    return sg.Window("PySimpleGUI-matplotlib連携テスト",layout)

window = make_mainwindow()

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED :
        break
    elif event == "show":
        graph_show()
    elif event == "redraw":
        window.close()
        window = make_mainwindow()
window.close()

これで試すと・・
最初はこう・・

show でグラフ表示するとこう

redrawで再描画するとこう

アイコンとタイトルバーは復活しました。サイズも戻りました。でもWidget(テキストとボタン)は小さいまま。アイコン、タイトルバーとWidgetを比較するとWidgetだけ縮んでいるのが分かります。なら、Widget再描画の時に中身のフォント・サイズまで指定したらどうか?

試行錯誤3

ウィンドウ作るところを

def make_mainwindow():
    btfont= ('Arial', 12)
    layout = [
        [sg.Text("コントロール",size=(40,1),font=btfont)],
        [sg.Button("show",font=btfont),sg.Button("redraw",font=btfont)]
    ]
    return sg.Window("PySimpleGUI-matplotlib連携テスト",layout)

と書き換えてみました。フォントの種類とサイズを指定してしまえば再描写
しても変わらないはず。ところが、

グラフ表示後は

やはり縮んでしまう。復活したアイコン・タイトルバーのサイズは変化していないので、Widgetだけが縮んでいることが分かります。
 昨日、すうち様にいただいたアドバイス
>可能性としてdpi設定やfigサイズが一致してない等があるそうです。
・・これは、フォント指定の数字が同じでも、基本単位が変えられてしまっていると言うことですかね。
>今はcopilot(Bing)やChatGPTに聞いてみるのも良いかもしれません。

そうでした、Copilot(Bing)に尋ねてみましょう。

試行錯誤4

copilot(Bing)に聞きました。

では、グラフ表示のところにフォントサイズ指定入れてみます。

def graph_show():
    plt.rcParams["font.size"]=30
    plt.title("グラフ", fontname="MS Gothic")
    plt.show()

フォントサイズ指定の効果は「グラフ側」の話、

コントロールウィンドウは相変わらず縮んでいましたし、redraw
してもこんな具合。

ここでひらめいた解決策

 copilotの言っているのは、フォントサイズを適切に「設定」しなおせ、ということなんでしょう。だけど、考えてみたら今回の問題、「matplotlibの最初のグラフ表示」の前後で何らかの設定が「変化」してしまうのがいけないんですよね。
 ならば、「途中」で「変化」が起こらないようにすればいい。グラフのウィンドウを一瞬開いて、閉じてから、メインのコントロールウィンドウをひらけばいいんじゃ?そして、最初から「縮んだ状態」を標準にして、フォントサイズなどの設計をすればいいんじゃない??

試行錯誤5

メインウィンドウ開く前に一瞬グラフウィンドウを開く

#先にグラフを表示してしまうと?
window = make_mainwindow()
graph_show()
plt.close()
while True:  ・・・・

おっと、これをやるとgraph_show()で止まってしまい。手動でグラフを閉じないとコントロールのウィンドウが現れません。
※但し、ここでグラフを手動で閉じた後に表示されるコントロール画面は予想とは逆で、縮んでいませんでした。その後、再度グラフ表示しても縮まず、アイコン・タイトルバーも無事。つまり、もともと期待した動作をしてくれました。(この場合、redrawボタンがそもそも不要。)
 縮んだ状態を標準と考えようとしたら、縮まなくなったわけです。

試行錯誤6

graph_show() の関数ところで、止まらないように、関数定義内の
plt.show() を plt.show(block=False) にしてみます。

 すると・・・大丈夫です。縮みません(笑)
 グラフを繰り返し表示したり閉じたりしても縮みません。
 これで、一応の解決となりました。最初にグラフ画面が一瞬表示されるのはややカッコ悪いですが、自分(と身内の間)で使うだけですし、期待したサイズでコントロールウィンドウが表示できていれば問題ないです。

最終的なコードは以下の通りです。

import PySimpleGUI as sg
import matplotlib.pyplot as plt

def graph_show():
    plt.title("グラフ", fontname="MS Gothic")
    plt.show(block=False)

def make_mainwindow():
    btfont= ('Arial', 12)
    layout = [
        [sg.Text("コントロール",size=(40,1),font=btfont)],
        [sg.Button("show",font=btfont)]
    ]
    return sg.Window("PySimpleGUI-matplotlib連携テスト",layout)

window = make_mainwindow()
graph_show()
plt.close()
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED :
        break
    elif event == "show":
        graph_show()
window.close()

(縮まない、という)期待通りの動作をしたので、良しと言うことにします。自分でも理解できていないけど、一応解決とします。



この記事が気に入ったらサポートをしてみませんか?