Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 13, 2016 02:23:56

demigod
Зарегистрирован: 2016-04-13
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

Думаю все знают, как выглядит прогресс бар в терминале линукса. Интересует такой вопрос, можно ли в питоне писать программы с такой же динамикой. Допустим мне нужно показать 1, 2, 3, 4, 5 и вместо вывода цифр на новую строку с каждой секундой, сделать так, чтобы цифра менялась в одном и том же месте. Надеюсь вы поняли о чем я

Офлайн

#2 Апрель 13, 2016 08:38:13

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

отталкивайтесь от

from sys import stdout
from time import sleep
text = '12345'
for i in range(len(text)):
    stdout.write(text[i])
    stdout.flush()
    sleep(1)
stdout.write("\r  \r\n")



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Апрель 13, 2016 13:54:48

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

Думал будет легкая задачка, которую я за 15 минут решу. Сидел 5 часов, в итоге получилось в PyQt5 сделать динамический интерфейс (если я правильно понял вашу трактовку дин.интерфейса) результат программы можно посмотреть в приложенной гифке.
Нажимаем кнопку “начать” и у нас идет отсчет.
Получается, динамический интерфейс сделать можно, правда придется прибегать к многопотоковости. Делал приложение 5 часов, потому что был вообще без понятия как это делается (многопоточность). Пробовал сделать однопоточное приложение, у меня не получись, когда вызывал sleep() приложение засыпало и ничего нельзя было с ним делать. Думаю, все же можно даже без потоков осуществить дин.интерфейс, т.е. вообще не использовать этот sleep(), но не уверен в этом.
Думаю, еще это можно сделать в Pygame, правда я с ним почти не знаком.

Отредактировано Lestoroer (Апрель 13, 2016 14:07:15)

Прикреплённый файлы:
attachment Animation.gif (42,9 KБ)

Офлайн

#4 Апрель 13, 2016 14:52:41

demigod
Зарегистрирован: 2016-04-13
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

ZerG
отталкивайтесь от
Не знаю как это работает, но сначала строка приняла значение 12345, поочередно, когда скрипт закончился 1 и 2 пропали. Tак и было запланировано?

Офлайн

#5 Апрель 13, 2016 14:54:10

demigod
Зарегистрирован: 2016-04-13
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

Lestoroer
Думал будет легкая задачка, которую я за 15 минут решу. Сидел 5 часов, в итоге получилось в PyQt5 сделать динамический интерфейс (если я правильно понял вашу трактовку дин.интерфейса) результат программы можно посмотреть в приложенной гифке. Нажимаем кнопку “начать” и у нас идет отсчет.Получается, динамический интерфейс сделать можно, правда придется прибегать к многопотоковости. Делал приложение 5 часов, потому что был вообще без понятия как это делается (многопоточность). Пробовал сделать однопоточное приложение, у меня не получись, когда вызывал sleep() приложение засыпало и ничего нельзя было с ним делать. Думаю, все же можно даже без потоков осуществить дин.интерфейс, т.е. вообще не использовать этот sleep(), но не уверен в этом.Думаю, еще это можно сделать в Pygame, правда я с ним почти не знаком.
Только начинаю с питоном разбираться, но мне кажется, что в терминале линукса это делается проще, поскольку для этого используется псевдографический интерфейс, насколько я понимаю.

Офлайн

#6 Апрель 13, 2016 15:31:45

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

demigod
Ну и в питоне это несложно. Я просто совсем не был знаком с потоками, а писал в PyQt5, а для него нету вообще книг, только на PyQt4 есть, вот с этим и возникли сложности.
Если вы просто хотите вывести цифры 1,2,3,4,5 через функцию print, то сойдет вот такой код :
import time
y = 0
x = 5
while y < x:
    y = y+1
    print(str(y))
    time.sleep(1)
На основе этого кода становится понятно (да и у товарища ZerG тоже самое)
, что если бы была программа с граф. интерфейсом, то там так же бы выводились эти 1,2,3,4,5, но только в “одно” место программы, а не построчно.

Офлайн

#7 Апрель 13, 2016 15:52:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2840
Репутация: +  186  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

> Допустим мне нужно показать 1, 2, 3, 4, 5 и вместо вывода цифр на новую строку с каждой секундой, сделать так, чтобы цифра менялась в одном и том же месте.
> что если бы была программа с граф. интерфейсом, то там так же бы выводились эти 1,2,3,4,5, но только в “одно” место программы, а не построчно.

>>> for i in range(5):
...     stdout.write("\b")
...     stdout.write(str(i))
...     sleep(1) 
4
P.S. Если интересует псевдографика - читай про curses



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 13, 2016 15:56:07)

Офлайн

#8 Апрель 14, 2016 02:53:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Меняющаяся строка (Динамический интерфейс)

Lestoroer
Думаю, все же можно даже без потоков осуществить дин.интерфейс
Да, раньше потоков не было, а прогрессбары были. Можешь и сейчас какие-нибудь коносольные программы посмотреть, многие исходники открыты.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version