Tkinter как сохранить виджеты при свернутом окне и отобразить их когда окно развернется

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Мой код отображает промежуточные результаты в окно, но если пользователь свернет окно то виджеты не сохранятся и вылетит ошибка.
Вот мой код:
Python:
import pytesseract
import numpy
import time
import pyscreenshot as ImageGrab
import cv2
import imutils
# -*- coding: utf-8 -*-
import string
import threading
import sys
import os
import clipboard
from  more_itertools import unique_everseen
import time
from PIL import *
from tkinter import *
from tkinter import scrolledtext
start_time = time.time()

files= ["1", "2", "3", "4", "5"]
i = 0
a_flag = 0
afg = True
a_flag_text1 = 1
thread1 = None #поток
list_vidget = [] #список с виджетами изображениями
img_list = [] #список с изображениями

def func(thread_number=[0]):
    global root1, thr, pole_can, img, filesi, img_2, i, p, filesi, i2, i5, a_flag, text_vidget, img_1, a_flag_text, text_vidget1, width_umnosh, height_umnosh, b, root1, text, img_list, img_list_vidget, flag, configure_window, flagw, flag_vidget2
    local_thread_number = thread_number[0]
    thread_number[0] += 1
    #создание окна
    root1 = Toplevel(root)#проверка закрытия окна
    root1.state('zoomed')
    text_vidget1 = scrolledtext.ScrolledText(root1, width = 200, height = 100, state=DISABLED )
    for i, item in enumerate(files):
        i += 1
        time.sleep(5)
        text_vidget1.pack()
        text_vidget = scrolledtext.ScrolledText(root1, width = 120, height = 20)
        text_vidget1.window_create(INSERT, window=text_vidget)
        text_vidget.insert(1.0,i)
        text_vidget.bind('<Control-a>', videlit)
        text_vidget.bind('<Control-c>', copy)
        text_vidget.bind('<Control-v>', vstavit)
      
def my_thread():
    # вызов потока
    global thread1
    thread1 = threading.Thread(target = func, name = "Thread-1")
    thread1.start()
def vstavit(event):#вставить текст
    global rf, files, files_del
    rf = clipboard.paste()
    files.append(rf)
    files_del.append(rf)

def copy(event): #скопировать текст
    clipboard.copy(vibor_file_ent_get)

def videlit(event):#выделить текст
    vibor_file_ent.select_range(0, 'end')
    vibor_file_ent.icursor('end')

root = Tk()
btn = Button(root, text = "click me", command = my_thread).pack()
root.mainloop()
Я пробовал ловить событие когда курсор вне окна или в окне, такой способ вроде работает но если событие поймать когда идет процесс то вылетит ошибка runtimeerror. В общем мне нужно чтобы пользователь мог свернуть окно в любой момент и когда он откроет окно все виджеты были в окне, в независимости от того развернуто окно после цикла или по середине цикла и главное чтобы функция i+=1 так же работала в независимости от положения окна. Так же если выделить или копировать текст по середине цикла, то так же вылетит ошика runtimeerror.
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 566
454
83
1. я не понял смысла вашей программы...
2. зачем столько импортов вы же не используете их все?
3. у вас нет понимания, что такое область видимости, совсем, при попытке скопировать вставить очень много ошибок, что переменные не определены...
4. пробовал сворачивать, виджеты не куда не деваются...
5. ваши копировать вставить не работают, а копирует и вставляет за вас система...
6. # -*- coding: utf-8 -*- пишется вначале файла...
7. vibor_file_ent_get и vibor_file_ent - определения этих имен вообще нет в коде, но вы пытаетесь их использовать...
8. global root1, thr, pole_can, img, filesi, img_2, i, p, filesi, i2, i5, a_flag, text_vidget, img_1, a_flag_text, text_vidget1, width_umnosh, height_umnosh, b, root1, text, img_list, img_list_vidget, flag, configure_window, flagw, flag_vidget2 - в этой строке большая часть имен не определена в коде...

объясните, что хотите сделать?
 
Последнее редактирование:

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
1. я не понял смысла вашей программы...
2. зачем столько импортов вы же не используете их все?
3. у вас нет понимания, что такое область видимости, совсем, при попытке скопировать вставить очень много ошибок, что переменные не определены...
4. пробовал сворачивать, виджеты не куда не деваются...
5. ваши копировать вставить не работают, а копирует и вставляет за вас система...
6. # -*- coding: utf-8 -*- пишется вначале файла...
7. vibor_file_ent_get и vibor_file_ent - определения этих имен вообще нет в коде, но вы пытаетесь их использовать...
8. global root1, thr, pole_can, img, filesi, img_2, i, p, filesi, i2, i5, a_flag, text_vidget, img_1, a_flag_text, text_vidget1, width_umnosh, height_umnosh, b, root1, text, img_list, img_list_vidget, flag, configure_window, flagw, flag_vidget2 - в этой строке большая часть имен не определена в коде...

объясните, что хотите сделать?
Я случайно взял это из своего настоящего кода и прикрепил их в пример, я не знаю какой дать вам пример, в моей программе есть pytesseract он долго сканирует текст, я решил уже готовые результаты выводить в окно, и как вы понимаете файлов для скана может быть много, как и символов в тексте в фотографии который pytesseract должен сканировать. И если пользователь захочет свернуть прогу, то все виджеты должны сохранится куда то чтобы не было ошибок и виджеты никуда не пропали соответственно. Мне нужно ловить событие через bind чтобы понимать свернуто окно или нет. Я использовал bind("<FocusIn>) и bind("<FocusOut>), но когда идёт занесение виджетов в окно и я сверну окно то вылетит ошибка runtimeerror, как я понимаю это из за того что bind в другом потоке, но как сделать так чтобы этой ошибки не было и я мог ловить событие и в зависимости от положения окна работать с виджетами. Например если окно свернуто то виджеты заносятся в список, а после развертки все виджеты из списка выводились на окно.
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Мой настоящий код может после обработки текста выводить виджеты в окно, то есть делать это одновременно с начала обрабатывать а потом сразу выводить. Я случайно взял ненужные переменные из своего настоящего кода и прикрепил их в пример, я не знаю какой дать вам пример, в моей программе есть pytesseract он долго сканирует текст, я решил уже готовые результаты выводить в окно, и как вы понимаете файлов для скана может быть много, как и символов в тексте в фотографии который pytesseract должен сканировать. И если пользователь захочет свернуть прогу, то все виджеты должны сохранится куда то чтобы не было ошибок и виджеты никуда не пропали соответственно. Мне нужно ловить событие через bind чтобы понимать свернуто окно или нет. Я использовал bind("<FocusIn>) и bind("<FocusOut>), но когда идёт занесение виджетов в окно и я сверну окно то вылетит ошибка runtimeerror, как я понимаю это из за того что bind в другом потоке, но как сделать так чтобы этой ошибки не было и я мог ловить событие и в зависимости от положения окна работать с виджетами. Например если окно свернуто то виджеты заносятся в список, а после развертки все виджеты из списка выводились на окно.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Мне нужно ловить событие через bind чтобы понимать свернуто окно или нет
Вот пример:
Python:
import tkinter as tk


def f1(e):
    print('Окно свернуто')


def f2(e):
    print('Окно развернуто')


root = tk.Tk()
root.bind("<Unmap>", f1)
root.bind("<Map>", f2)
root.mainloop()
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Вот пример:
Python:
import tkinter as tk


def f1(e):
    print('Окно свернуто')


def f2(e):
    print('Окно развернуто')


root = tk.Tk()
root.bind("<Unmap>", f1)
root.bind("<Map>", f2)
root.mainloop()
Если свернуть окно когда идёт цикл for то выйдет ошибка runtimeerror, я же уже об этом писал.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Если свернуть окно когда идёт цикл for то выйдет ошибка runtimeerror, я же уже об этом писал.
В вашем коде этого не видно - вам об этом уже тоже писали.
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
В вашем коде этого не видно - вам об этом уже тоже писали.
Python:
import pytesseract
import numpy
import time
import string

import threading
import clipboard
from PIL import *
from tkinter import *
from tkinter import scrolledtext
from tkinter.filedialog import askopenfilename
start_time = time.time()

files= []
afg = True

a_flag_text1 = 1
thread1 = None #поток
def func(thread_number=[0]):
    global thr
    local_thread_number = thread_number[0]
    thread_number[0] += 1
    root1 = Toplevel(root)
    text_vidget1 = scrolledtext.ScrolledText(root1, width = 200, height = 100, state=DISABLED )
    text_vidget1.pack()
    for i in range(1, 3):
        time.sleep(3)
        text_vidget = scrolledtext.ScrolledText(root1, width = 120, height = 20)#создание виджета text со скролбаром
        text_vidget1.window_create(INSERT, window=text_vidget)#добавление виджета в общий виджет
        text_vidget.insert(1.0,i)
def my_thread():
    # вызов потока
    global thread1
    thread1 = threading.Thread(target = func, name = "Thread-1")
    thread1.start()

def vstavit(event):#вставить текст
    global rf, files, files_del
    rf = clipboard.paste()
    files.append(rf)

def copy(event): #скопировать текст
    clipboard.copy(vibor_file_ent_get)


def videlit(event):#выделить текст
    vibor_file_ent.select_range(0, 'end')
    vibor_file_ent.icursor('end')

root = Tk()
scan_btn = Button(root, text = "click me", command = my_thread).grid()

root.mainloop()
Попробуйте проверить этот код и попробуйте сворачивать окно несколько раз когда идёт занесение виджетов.
 

Форум IT Специалистов