Вы можете использовать contextlib
.
from contextlib import contextmanager
import sys
@contextmanager
def stdout_redirector():
class MyStream:
def write(self, msg):
prefix = 'augmented:' if msg.strip() else ''
old_stdout.write( prefix + msg)
def flush(self):
old_stdout.flush()
old_stdout = sys.stdout
sys.stdout = MyStream()
try:
yield
finally:
sys.stdout = old_stdout
Лучше использовать оператор with
для управления перенаправлением. Если это невозможно в вашем случае, вызов методов __enter__()
и __exit__()
объекта перенаправителя также работает. Вы также можете поместить эти коды перенаправителя в функцию-ловушку pre_run_cell
и post_run_cell
в IPython.
Я создал производный элемент управления вкладки около года назад. Я не собираюсь публиковать здесь источник, потому что он длиной около 700 строк и довольно запутанный. Может быть, я найду время, чтобы очистить код, а затем выпустить его здесь. Сейчас я кратко опишу способ его построения.
Каждая вкладка имеет значок «X» слева от заголовка, а страницы вкладок поддерживают переупорядочение путем перетаскивания и перемещения между ними. управление несколькими вкладками.
Я выбираю простой способ получить значок на вкладках. Элемент управления вкладками имеет свойство TabControl.ImageList
, а вкладка имеет свойство TabPage.ImageIndex
. Поэтому я просто добавил три значка в список изображений - обычный, при наведении, нажатие - и обработал события мыши.
С помощью TabControl.GetTabRect ()
вы можете проверить, находится ли мышь над определенной вкладкой. и с некоторой математикой вы найдете, если это над значком. Затем вам просто нужно изменить значок в зависимости от состояния кнопки мыши и в конечном итоге удалить вкладку под мышью, если кнопка была нажата.
Основная проблема этого решения заключается в том, что для вычисления, если мышь находится над значком, требуется знать, где значок нарисован относительно вкладки, и это может измениться с новой версией Windows. И значок слева от заголовка,
I created a setup that is similar.
Each control that is added to the tab page at runtime is derived from a special base control I created. This base control has a close button (along with some other features such as safe to close flag).
Close tab code I'm using on my base control:
TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(parent);