質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

394閲覧

PySimpleGUIのウィンドウの文字が真っ黒になるので、改善したいです。

Ta2S

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/09/23 15:33

0

0

実現したいこと

PySimpleGUIのウィンドウの文字が真っ黒になるので、改善したいです。

前提

windows11+python3+OpenCV+PySimpleGUIで写真を撮影して表示するプログラムを作成しようとしている初心者です。
USBカメラの起動設定処理等に約17秒の時間がかかるので、その間に「ソフト起動中」の表示をしようしています。

発生している問題・エラーメッセージ

次の処理を調べ、組み込もうとしましたが、下記コードだけで動作させても、プログラムに組み込んでも、文字部分が真っ黒になります。
エラーメッセージは、出ません。

該当のソースコード

import PySimpleGUI as sg
import time

ウィンドウのレイアウトを定義

layout = [[sg.Text('ソフト起動中', font=('Helvetica', 20), justification='center')]]

タイトルバー無しのウィンドウを作成

window = sg.Window('Window Title', layout, no_titlebar=True, keep_on_top=True, finalize=True)

ウィンドウを中央に配置

window.TKroot.geometry("+%d+%d" % (window.TKroot.winfo_screenwidth() / 2 - window.TKroot.winfo_reqwidth() / 2,
window.TKroot.winfo_screenheight() / 2 - window.TKroot.winfo_reqheight() / 2))

ウィンドウを5秒間表示

time.sleep(5)

ウィンドウを閉じる

window.close()

試したこと

フォントを変えてみても真っ黒で変わりませんでした。

下記のように一部修正し、点滅表示にしてみると、真っ黒になりませんし、点滅後に表示したままにできないことはなかったのですが、起動中に点滅処理はできませんし、できるだけシンプルなプログラムにしたいと考え、点滅後に表示したままにするという方法はとりたくありません。

テキストを点滅表示するためのフラグ

flag = True

ウィンドウを5秒間表示

start_time = time.time()
while time.time() - start_time < 5:
event, values = window.read(timeout=100)
if event == sg.WIN_CLOSED:
break

テキストの表示を切り替える

if flag:
window['text'].update(visible=False)
flag = False
else:
window['text'].update(visible=True)
flag = True

更に試行錯誤してみて、なぜかwindow.readを入れると文字が黒くならなくなる、対処療法ができました。

import PySimpleGUI as sg
import time

起動中ウィンドウのレイアウトを定義

sg.theme('LightGreen') # 画面の配色テーマ
layout = [[sg.Text('検査ソフト起動中', font=('Helvetica', 20), justification='center')]]

タイトルバー無しの起動中ウィンドウを作成

window = sg.Window('Window Title', layout, no_titlebar=True, keep_on_top=True, finalize=True)
event, values = window.read(timeout=100)

time.sleep(5)

ウィンドウを閉じる

window0.close()

ウィンドウが小さいので、レイアウトで上下にスペースを入れて広げると、また文字が真っ黒になりました。

補足情報(FW/ツールのバージョンなど)

windows11
VSCode 1.81.1
python3.11.4
opencv-python 4.7.0.72
PySimpleGUI 4.60.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純に、5秒経過したらループを抜けるようにしてみてはどうでしょうか。

py

1import PySimpleGUI as sg 2import time 3 4sg.theme('LightGreen') # 画面の配色テーマ 5layout = [[sg.Text('検査ソフト起動中', font=('Helvetica', 20), justification='center')]] 6window = sg.Window('Window Title', layout, no_titlebar=True, keep_on_top=True, finalize=True) 7 8window.TKroot.geometry("+%d+%d" % (window.TKroot.winfo_screenwidth() / 2 - window.TKroot.winfo_reqwidth() / 2, 9window.TKroot.winfo_screenheight() / 2 - window.TKroot.winfo_reqheight() / 2)) 10start_time = time.time() 11while True: 12 event, values = window.read(timeout=100) 13 if event == sg.WIN_CLOSED: 14 break 15 # 5秒経過したらループを抜ける。 16 if time.time() - start_time > 5: 17 break 18 19# ウィンドウを閉じる 20window.close() 21 22 23 24# 以降にメインのウィンドウ等を表示する処理を書く 25# layout_main = [[sg.Text('メインウィンドウ', font=('Helvetica', 20), justification='center', key='text2')]] 26# window_main = sg.Window('Main Title', layout_main, keep_on_top=True, finalize=True, resizable=True, size=(400, 300)) 27# .. 28# .. 29# . 30

投稿2023/09/23 20:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ta2S

2023/09/24 09:20

回答ありがとうございます。 教えていただいたコードを入れると、文字が表示されました。 5秒も待ちたくないと、上下スペース挿入無しで、start_time > 0:にしてチェックしてみると、 timeout=1 真っ黒 timeout=2~5 文字が表示されない timeout=6以上 正常に文字が表示される 教えていただく前の、event, values = window.read(timeout=10)挿入では、 timeout=1~7 文字が表示されない timeout=8以上 正常に文字が表示される このように、なりました。 timeout=の時間を延ばせば、window表示を変更しても、文字を表示できる可能性が見えました。 本プログラムの中で、timeout=の時間を調整しながら作成してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問