Метод 1 - если tkinter использует модуль «Предупреждения»
На странице со ссылкой, предоставленной OP, описана методика, которая подавляет отдельные предупреждающие сообщения.
К сожалению, я не могу продублировать ваше предупреждение на компьютерах с Windows или Linux, поэтому я не могу сказать, сработает ли это исправление, но вот так:
import warnings
warnings.filterwarnings('ignore', message='Class FIFinderSyncExtensionHost is implemented in both')
Этот код, очевидно, будет фильтровать на основе части текста из сообщения. Также доступны другие опции, такие как использование имени модуля и т. Д.
Что хорошего в этом решении, так это то, что существует так много способов получить индикатор, что его следует игнорировать. В приведенном выше примере я принял участие в сообщении об ошибке и использовал его при вызове filterwarnings
. Позволяет легко фильтровать одно предупреждение или группу из них.
Вот небольшая демонстрационная программа, которая генерирует предупреждение, а также демонстрирует, как текст может использоваться для его фильтрации.
import PySimpleGUI as sg
import warnings
layout = [[sg.Text('My Text Editor')],
[sg.B('Enable Filter'), sg.B('Warning')],]
window = sg.Window('My Text Editor', layout)
while True: # Event Loop
event, values = window.Read()
if event is None:
break
print(event, values)
if event == 'Warning':
warnings.warn("my warning goes here")
elif event.startswith('Enable'):
warnings.filterwarnings('ignore', message='my warning')
window.Close()
Документация Python описывает предупреждения, модулированные здесь:
https://docs.python.org/3.6/library/warnings.html#warnings.filterwarnings
И эта страница хорошо объяснила некоторые из понятий:
https://pymotw.com/2/warnings/
Метод 2 - Перенаправление STDERR и / или STDOUT
Поскольку вышеописанный метод № 1 ничего не исправил, вы можете перенаправить stderr и / или stdout во время отображения оскорбительного сообщения.
Вот небольшая тестовая программа, которая перенаправит и восстановит как stderr, так и stdout и снова вернет их в нормальное состояние. Используйте его, чтобы отключить один или другой и попытаться сделать FileBrowse, пока один из них повторно. По крайней мере, это скажет вам, отображается ли он на stdout, stderr или на обоих.
import PySimpleGUI as sg
import sys
sg.ChangeLookAndFeel('GreenTan')
layout = [ [sg.In(), sg.FileBrowse()],
[sg.OK(), sg.B('StdErr Reroute'), sg.B('StdOut Reroute'), sg.B('Restore')]]
window = sg.Window('My new window', layout)
temp_stderr = temp_stdout = None
while True: # Event Loop
event, values = window.Read()
if event is None:
break
elif event.startswith('StdErr'):
temp_stderr = sys.stderr
sys.stderr = None
elif event.startswith('StdOut'):
temp_stdout = sys.stdout
sys.stdout = None
elif event == 'Restore':
if temp_stderr:
sys.stderr = temp_stderr
temp_stderr = None
if temp_stdout:
sys.stdout = temp_stdout
temp_stdout = None
print(event, values)
Когда вы запустите это, нажмите кнопку OK после перенаправления вывода, вы увидите, что на консоли ничего не распечатывается. Восстановите его снова, затем нажмите OK, и вы снова увидите вывод.
Если вы можете окружить только тот объем кода, который вызывает проблему, перенаправив его в никуда, а затем восстановив снова, этот метод должен сработать.
Если вы не можете временно перенаправить маршрут, то вы можете создать класс, который перенаправит stdout и stderr в ваш класс. Это даст вам полный контроль над фильтрацией, чтобы при отображении предупреждения вы не позволяли этим символам выходить на официальный stdout / stderr, а для всего остального, через что вы передаете данные.