ウィンドウが縮む問題:一応解決
(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()
(縮まない、という)期待通りの動作をしたので、良しと言うことにします。自分でも理解できていないけど、一応解決とします。