Создание строки поиска для фильтрации и обновления, однако, похоже, что idle загружается / в скрытом цикле без возвращаемого значения

#python-3.x #tkinter

Вопрос:

Без нажатия кнопки поиска все работает нормально и возвращает значение. Однако использование кнопки поиска приведет к приостановке кода.

Основная проблема заключается в проверке (), вложенной в chooseBoard (), которая вызывает саму себя, вызывая постоянный «скрытый цикл».

Это означает, что код не продолжается с:

board = tempPreset.chooseBoard(None)

и не может вернуть желаемое значение.

Короче говоря, мой вопрос в том, как исправить проблему вложенного цикла, из-за которой он не продолжается после завершения проверки() при нажатии кнопки поиска. Так как значение правильное, когда я печатаю его оттуда.

 
import tkinter as tk
from tkinter import filedialog, messagebox, ttk

class PresetUpdate:

    def __init__(self,master,area,board):
        self.root = master
        self.root.title('Preset')
        self.root.geometry(area)

        self.board = board

    def boardId(self,name):
        self.name = name
        self.var.set(name)
        self.root.destroy()

    def chooseBoard(self, newBoard):

        def check():
            #set variables
            self.newBoard = {}
            r = re.compile(self.e.get(), re.IGNORECASE)
            #regex to see words in list
            for k in self.board:
                
                if r.search(k) != None:
                    self.newBoard.update({r.search(k).string : self.board[r.search(k).string]})

            if self.newBoard == {}:
                self.newBoard = self.board
            
            self.root.destroy()
            #creating new root
            master = tk.Tk()
            self.__init__(master,'460x475',self.board)

            #re-calling function with update list
        
            self.chooseBoard(self.newBoard)

            return self.board[self.name]
            #print(self.board[self.name])
        
        #set variables
        self.newBoard = self.board if newBoard is None else newBoard
        
        self.var = tk.StringVar()
        self.button = {}
        
        #setting search bar / button
        self.e = tk.Entry(self.root,width=30)
        self.e.grid(row=0,column=2,padx=10,pady=10)

        click = tk.Button(self.root, text='Search', height=1,width=5,command=check)
        click.grid(row=0,column=1,padx=10,pady=10)

        #creating buttons of dct
        for i,boardName in enumerate(self.newBoard):
            #print(i,boardName,self.board[boardName])
            self.button[i] = tk.Button(self.root, text=boardName,height=2,width=30,command=lambda name=boardName:self.boardId(name))
            self.button[i].grid(row=i 1,column=1,padx=10,pady=10)

    
        #pause until a button has been pressed
        self.button[i].wait_variable(self.var)

        return self.board[self.name]


r = {'test1' : '0','test2' : '1','test3' : '2','test4' : '3','test5' : '4'}

def main():
    if __name__ == '__main__':

        master = tk.Tk()
        tempPreset = PresetUpdate(master,'460x475',r)
    
        board = tempPreset.chooseBoard(None)

        print(board)
        
        master.mainloop()

    
main()
 

Ответ №1:

Я нашел решение:

 def chooseBoard(self, board):
        
        def check():
            #set variables
            self.newBoard = {}
            r = re.compile(self.e.get(), re.IGNORECASE)
            #regex to see words in list
            for k in self.board:
                
                if r.search(k) != None:
                    self.newBoard.update({r.search(k).string : self.board[r.search(k).string]})

            if self.newBoard == {}:
                self.newBoard = self.board

            for i,item in enumerate(self.board):
                if item not in self.newBoard:
                    self.button[i].destroy()

            if self.newBoard == self.board:
                
                for i,item in enumerate(self.board):
                    self.button[i].destroy()

                createButtons()
                 
        #set variables
                
        self.newBoard = self.board if self.newBoard is None else self.newBoard
        
        self.var = tk.StringVar()
        self.button = {}
        #setting search bar / button
        self.e = tk.Entry(self.root,width=30)
        self.e.grid(row=0,column=2,padx=10,pady=10)

        click = tk.Button(self.root, text='Search', height=1,width=5,command=check)
        click.grid(row=0,column=1,padx=10,pady=10)


        #creating buttons of dct
        def createButtons():
            for i,boardName in enumerate(self.newBoard):
                #print(i,boardName,self.board[boardName])
                self.button[i] = tk.Button(self.root, text=boardName,height=2,width=30,command=lambda name=boardName:self.boardId(name))
                self.button[i].grid(row=i 1,column=1,padx=10,pady=10)

            return i 

        i = createButtons()

        #check()
        #pause until a button has been pressed
        self.button[i].wait_variable(self.var)

        return self.board[self.name]