Скажем, вот такой пример.
#!/usr/bin/python3
import tkinter as tk
import sys
globs = {'AbortAll':False}
class Top:
def __init__(self):
self.widget = tk.Toplevel(root)
self.widget.withdraw()
def show(self):
self.widget.deiconify()
class Text:
def __init__(self,parent_obj):
self.parent_obj = parent_obj
self.widget = tk.Text(self.parent_obj.widget)
self.widget.pack(expand=1,fill='both')
def insert(self,text='text'):
self.widget.insert('1.0',text)
def quit_real(*args):
root.destroy()
sys.exit()
def run1(text):
if not text:
globs['AbortAll'] = True
if globs['AbortAll']:
return None
else:
return text.strip()
def run2(widget,text):
if globs['AbortAll']:
pass
else:
widget.insert('1.0',text)
root = tk.Tk()
root.protocol("WM_DELETE_WINDOW",quit_real)
root.withdraw()
top1 = Top()
txt1 = Text(top1)
top2 = Top()
txt2 = Text(top2)
top1.show()
top2.show()
class Chains:
def __init__(self,handler,text):
self.handler = handler
self.text = text
def process(self):
self.text = run1(self.text)
run2(self.handler.widget,self.text)
#text1 = None
text1 = ' Жили у бабуси 2 веселых гуся. '
text2 = ' Кто в Москве не бывал - красоты не видал. '
chain1 = Chains(txt1,text1)
chain2 = Chains(txt2,text2)
chain1.process()
chain2.process()
root.mainloop()
Пример рабочий. Но что будет, если на входе будет, например, не строка, а None? Если убрать проверку AbortAll - получим ошибку. Если не убрать - везде будет глобальная отмена, в результате, если не будут обработаны данные для 1-го виджета, то и 2-й виджет останется незаполненным. Пока что вижу такие варианты:
1) Смириться с тем, что если одна цепочка процедур дает сбой, то и вторую тоже приходится завершать
2) Возвращать фейковые данные, если на входе что-то не то. Например:
if text is None:
return ''
Однако, это может сильно усложнить отладку.