Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
Kivy

Как работает on_enter в Screen?

13.03.2020, 09:51. Показов 2304. Ответов 0

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Я пытаюсь написать прогу, в которой есть несколько экранов. При нажатии на кнопку на главном экране должен открываться другой, на котором сразу должно быть отображена надпись и Progressbar. дальше начинается сканирование ip адресов локальной сети. Сканирование запускается в несколько потоков, конкретно в 255, по количеству адресов( а чего мелочиться). Результаты сканирования сохраняются в файле. Экран со Прогрессбаром должен быть на экране пока количество потоков больше 1. Соответственно ПрогрессБар должен отображать ход сканирования. Чем меньше живых потоков, тем больше процент выполнения. Сканирование занимает около 15- 20 секунд. Затем должен появляться другой экран со списком доступных устройств и их ip.
Для того, чтобы запустить сканирование решил использовать событие on_enter класса Screen. т.е как только заканчивается прорисовка окна запускается сканирование.
Файлы не привожу полностью, чтобы не загромождать и без того сумбурное описяние проблемы.


файл scan.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
.....
class Ip_scaner():
    def __init__(self):
        self.ip = socket.gethostbyname(socket.gethostname())
        ip_list = self.ip.split('.')
        self.net = ip_list[0] + '.' + ip_list[1] + '.' + ip_list[2] + '.'
        system = platform.system()
        if system == 'Windows':
....................
    def scan_ip(self, addr, file, f=False):
...............
     #В функцию передаем объект progress, в котором будет отображаться прогресс выполнения
 
     def thread_scan(self, progress: ProgressBar, min, max, num_thread=255, file_name='ips' ):
        with open(file_name, 'w') as f:
            threads_list = []
            for addr in range(min, max + 1):
                threads_list.append(threading.Thread(target=self.scan_ip, args=(addr, f, True)))
 
            for threads in threads_list:
                threads.start()
 
            while threading.active_count() > 1: 
                percent = 100 - 100 * threading.active_count() // num_thread
                # print(percent)                                 #проверка работы сканирования в консоли
                progress.value = percent                    #Установка значения прогресс
                # progress.canvas.ask_update()         # как этовообще работает? 
 
 
main_screen = Main_screen(name='main')
choose_screen = Choose_screen(name='chooser')
net_finder = Net_finder()
net_finder.name = 'finder'
net_screen = Net_screen()
net_screen.name = 'net_chooser'
sm = ScreenManager(transition=NoTransition())
sm.add_widget(main_screen)
sm.add_widget(choose_screen)
sm.add_widget(net_screen)
sm.add_widget(net_finder)
файл net.kv
.......
BoxLayout:
orientation: 'horizontal'
Button:
size_hint: .5, .7
pos_hint: {'center_y': .5}
text: 'сеть'
on_release: root.net_scan()
Button:
background_color: 0,0,1,1
size_hint: .8, .7
pos_hint: {'center_y': .5}
font_size: self.height*.2
text:"связаться"
on_release: root.connect()
......

файл net.py
........
Python
1
2
3
4
class Main_screen(Screen):
....
    def net_scan(self):
        sm.current = 'finder'
.....
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Net_finder(Screen):
    def __init__(self):
        super(Net_finder, self).__init__()
        self.a_layout = AnchorLayout(anchor_x='center', anchor_y='center')
        self.lebel = Label(text='Сканирую сеть')
        self.b_layout = BoxLayout(orientation='vertical')
        self.f_layout = AnchorLayout(anchor_y='center')
        self.progress = ProgressBar(max=100, size_hint_x=.8, pos_hint={'center': .5})
        self.f_layout.add_widget(self.progress)
        self.b_layout.add_widget(self.lebel)
        self.b_layout.add_widget(self.f_layout)
        self.a_layout.add_widget(self.b_layout)
        self.add_widget(self.a_layout)
 
        self.scaner = Ip_scaner()
 
    def on_enter(self):
        self.scaner.thread_scan(progress=self.progress, min=1, max=255)
        sm.current = 'net_chooser'
Я предполагал, что при срабатывании события on_enter на экран должно выводиться self.progress, а в методе thread_scan будет меняьтся атрибут progress.value.
На самом же деле при срабатывании события on_enter начинается смена окна (если настроен какой-то переход, то графика доходит до последнего кадра. Если перехода нет, то просто остается изображения окна с нажатой кнопкой). С верху этого изображения появляется изображение окна на которое меняется (net_finder). Запускается метод thread_scan( процесс его выполнения видно в консоле). И графика не обновляется, пока не закончится выполнение trread_scan. Затем главное окно изчезает и остается net_chooser (окно со списком найденных устройств и ip).
Такое впечатление что на время выполнения блока on_enter, графика просто перестает обновляться. И обновление возобновляется только после отработки on_enter.

И ВОТ НАКОНЕЦ-ТО МОЙ ВОПРОС! Что нужно делать чтобы изменения графики были видны?
Пытался писать в thread_scan
progress.canvas.ask_update() не помогает. я не понимаю как это работает
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2020, 09:51
Ответы с готовыми решениями:

Как сфоткать рабочую область, если Кнопка "Print Screen" не работает?
Как сфоткать рабочую область если Кнопка "Print Screen" не работает? есть может какая команда?

На работает Touch-Screen
Всем привет, Есть два тач-монитора. Реагируют оба монитора, но один (главный) корректно, а второй реагирует так, как будто это первый...

Не работает @media only screen
перестало работать @media only screen для div <div class="container"> .... </div> файл стилей @media only screen...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2020, 09:51
Помогаю со студенческими работами здесь

@media and screen не работает
Доброго времени суток, данная проблема заключается вот в чем. @media screen and (max-height: 768px) { footer { position:...

Не работает @media screen
Всем привет! Есть код: .product { width: 780px; overflow: hidden; margin: 0 auto; } и есть @media screen

Не работает print screen
Перестала работать кнопка print screen. При выгрузке скрина в Paint не вставляется изображение. С чем может быть связана данная проблема?

Не работает @media only screen and
Пытаюсь научиться верстке (с помощью Notepad++) - и вот хочу разобраться в командой "@media only screen and" - но она у меня...

Не работает @media screen
Пишу код в visual studio code. Тестирую сайт на google chrome. Такой код не работает - при меньше 870 страница не исчезает ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru