据我所知,使用
tkinter
时这是一个持续存在的问题,因为它不是 multi-threaded
。我已经阅读了很多有关此问题的文章,但我不知道如何在我的案例中解决它。
我的应用程序由在本地服务器中运行的
plotly dash
组成,其中有一个按钮调用一个函数,该函数对 Excel 执行一系列处理。一开始按下按钮时我得到了main thread is not in main loop
。尽管如此,设置一个daemon
我还是设法避免了它。但是,如果我再次按下按钮,程序将停止工作并出现上述错误。
这是我的情节破折号的总结脚本:
def interact_callbacks(self):
@callback(
Output('add-automatically-button', 'children'),
Input('add-automatically-button', 'n_clicks')
)
def update_output(n_clicks):
if n_clicks is not None:
t = threading.Thread(target=startInteraction)
t.setDaemon(True)
t.start()
return 'Clicked!'
else:
return 'Add automatically'
这是位于不同 .py 中的函数 startInteraction()
def startInteraction():
gui = GUI()
gui.get_excel_path()
path=gui.path
confirmation = gui.confirmationPopUp(path)
sys.stderr.write("***OK: selected**\n")
if(confirmation):
sys.stderr.write("***OK***\n")
defectLoader(path)
else:
sys.stderr.write("***CANCEL***\n")
gui.errImport()
exit()
这是我的gui类(我在这个类中有更多的弹出窗口)
class GUI():
def __init__(self):
self.path = None
def get_excel_path(self):
size = {
"size": (40, 1)
}
layout = [
[sg.Text('Select Database (Excel):')],
[sg.Input(**size), sg.FileBrowse(file_types=(("Excel File", "*.xlsx"),))],
[sg.OK(), sg.Cancel()]
]
window = sg.Window('File Browser', layout)
event, values = window.read()
window.close()
try:
file_path = values[0]
if event == 'Cancel' or not file_path:
sys.stderr.write("***CANCEL***\n")
raise Exception('No file selected')
self.path= file_path
except Exception as e:
sg.popup(f'Error: {e}')
exit()
如何在这段代码中编写线程队列?还有其他选择吗?
这是尝试将
plotly dash
库与 tkinter
或 pysimplegui
组合时的典型问题。几年前我遇到了类似的问题,并通过执行以下操作解决了它:
p = Process(target=yourFunctionName)
p.start()
不要忘记执行以下导入:
from multiprocessing import Process
您的情况:
def interact_callbacks(self):
@callback(
Output('add-automatically-button', 'children'),
Input('add-automatically-button', 'n_clicks')
)
def update_output(n_clicks):
if n_clicks is not None:
p = Process(target=startInteraction)
p.start()
return 'Clicked!'
else:
return 'Add automatically'
我希望这能解决您的问题,并且您可以完成您的应用程序。