Как запустить код в фоновом режиме, не затрагивая графический интерфейс tkinter? - PullRequest
0 голосов
/ 26 октября 2019

Я разрабатываю графический интерфейс с использованием tkinter, который выступает в качестве средства просмотра изображений. Рабочий процесс заключается в том, что мы выбираем изображение с параметром «новое изображение» в строке меню, которое отображает выбранное изображение на холсте и создает небольшое окно со строками и столбцами, в котором отображаются все изображения, присутствующие в папке выбранного изображения. Проблема, с которой я сталкиваюсь, заключается в том, что когда загружаются все изображения из папки, это занимает около 6 секунд, и только после этого 6 секунд выбранное изображение отображается на холсте. я хочу сначала отобразить выбранное изображение и, как фоновый процесс, загрузить изображения в папку. это код self.drawImage () - отображает изображение (self.image) на холсте, self.folderImg () - загружает все изображение с пути (self.path) и отображает его в окне строк и столбцов

  def newImage(self):

        self.imageName= filedialog.askopenfilename()
        filetype=""
        try: filetype=imghdr.what(self.imageName)
        except:
           messagebox.showinfo(title="Image File",message="Choose an Image File!" , parent=self.master)
        self.path=os.path.split(self.imageName)[0]

        if filetype in ['jpeg', 'bmp', 'png', 'tiff']:            
            im= PIL.Image.open(self.imageName)
            self.image=im
            self.originalImage=im.copy()
            self.imageSize=im.size

            self.imageForTk=self.makeImageForTk()   
            self.drawImage()            
            self.folderImg()

Я прочитал какой-то пост и пришел к выводу, что многопоточность будет работать, поэтому я изменил "self.folderImg ()" на

t1=threading.Thread(target=self.folderImg)
t1.start()

, он не работал, когда я разместил его после "self.image = im ", это дало тот же результат, что и раньше, но когда я поместил его как последнюю строку, я получил вывод, я хотел, чтобы изображение холста отображалось раньше, и через 6 секунд отображались только изображения папок, но в течение этих 6 секундGUI застрял и не отвечает, не могу нажать любую кнопку. Пожалуйста, дайте решение для загрузки изображений папки с меньшим временем или без ущерба для функциональности графического интерфейса

окончательный код

  def newImage(self):

        self.imageName= filedialog.askopenfilename()
        filetype=""
        try: filetype=imghdr.what(self.imageName)
        except:
           messagebox.showinfo(title="Image File",message="Choose an Image File!" , parent=self.master)
        self.path=os.path.split(self.imageName)[0]

        if filetype in ['jpeg', 'bmp', 'png', 'tiff']:            
            im= PIL.Image.open(self.imageName)
            self.image=im
            self.originalImage=im.copy()
            self.imageSize=im.size
            self.imageForTk=self.makeImageForTk()   
            self.drawImage()

            t1=threading.Thread(target=self.folderImg)
            t1.start()

...