主线程不在主循环tkinter中,具有多个pysimplegui或tkinter对象的多线程

问题描述 投票:0回答:1

据我所知,使用

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()

如何在这段代码中编写线程队列?还有其他选择吗?

python multithreading user-interface tkinter pysimplegui
1个回答
2
投票

这是尝试将

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'

我希望这能解决您的问题,并且您可以完成您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.