Kolejny print w tej samej linijce

0

Witam. Czy zna ktoś jakieś inne niż end = '' sposoby na to, by treść kolejnego print() zapisywała się w tej samej linijce co treść poprzedniego? Pytam, bo z jakichś powodów taki program działa mi w pycharmie, ale jak odpalam plik, to już nie...

1

Nie używać print tylko bezpośrednio jakiegoś sys.stdout.write() na przykład?

0

Zawsze można też zebrać te print-y w jakimś stringu i wyświetlić razem, o ile użytkownik potrzebuje od razu całości.

0
irokura napisał(a):

program działa mi w pycharmie, ale jak odpalam plik, to już nie...

Pokaż ten fragment co Ci działa w PyCharmie a poza już nie.

0
from time import sleep
import os

znak = 'o'
puste = ' '

lista = [1,0,0,0,0,0,1,0,0,0,0,0,0,0]

i = -1

for rzecz in lista:
    os.system('cls')
    if i < (len(lista) - 1):
        lista[i] = 0
        lista[i+1] = 1

    for litera in lista:
        if litera == 0:
            print(puste, end = '')
        elif litera == 1:
            print(znak, end = '')

    sleep(1)

input()

To prosta animacja (kropka zjadająca kropkę). Jak usunę end = '' to działa i w jednym i w drugim...

0

Szczerze mówiąc nie rozumiem co się dzieje w Twoim kodzie. Masz jakieś i, które zawsze jest równe -1, czyścisz ekran, wypisujesz znak po znaku. Faktycznie i tak bym się spodziewał, że te printy coś wypiszą, a nie wypisują u mnie dopóki nie zakończy się działania programu, ale sam program też jest nieco dziwnie napisany.
Jak to ma działać? Coś takiego?

from time import sleep

znaki = [
    ' ',
    'o'
]

lista = [1,0,0,0,0,0,1,0,0,0,0,0,0,0]

while True:
    lista_str = list(map(lambda x: znaki[x], lista))
    print(''.join(lista_str), end='\r')
    lista = [lista[-1]] + lista[:-1]
    sleep(0.1)

0
from time import sleep
import os

znak = 'o'
puste = ' '

lista = [1,0,0,0,0,0,1,0,0,0,0,0,0,0]

i = -1

for rzecz in lista:
    os.system('cls')
    if i < (len(lista) - 1):
        lista[i] = 0
        lista[i+1] = 1

    for litera in lista:
        if litera == 0:
            print(puste, end = '')
        elif litera == 1:
            print(znak, end = '')

    sleep(1)
    i += 1

input()

W poprzednim poście zapomniałem o i += 1, kod powinien wyglądać tak jak powyżej.

1

Daj print() przed sleepem.

0

przecież dałem...

1

nie dałeś .. chodzi mi dosłownie o to co napisałem .. linijkę nad sleep(1) wstaw "print()".
albo możesz do swoich printów dopisać print(znak, end = '', flush=True)
lub zamiast pustego print() na końcu dać: sys.stdout.flush()

0

wiem, dałem i działa...
Muszę tylko przemyśleć, dlaczego...

1

Python tak działa, że buforuje sobie znaki, dopóki nie dostanie znać, że ma wysłać je na ekran. W PyCharmie (z którego nie korzystam) widocznie jest to inaczej nieco obsłużone.

1
irokura napisał(a):

wiem, dałem i działa...

Muszę tylko przemyśleć, dlaczego.

Nie napisałeś, jak odpalasz w PyCharmie - są 3 opcje:

  1. zielonym guzikiem
  2. w okienku terminala
  3. w okienku python console

u mnie na WIN działa 2) ale trochę brzydko podobno jest to tylko jakiś wrapper na terminal systemowy
podejrzewam że standardowo opcja 1) odpala jakąś wariację opcji 3) - możesz to ustawić

konsola pythonowa jest jedną z wielu zjepsutych rzeczy w pythonie

A przy okazji obczaj taki kod jak płynnie śmiga (dla jednolinijkowych animacji) niezależnie jak to odpalisz:

from time import sleep
from sys import stdout


znak = 'o'
puste = ' '
lista = [1,0,0,0,0,0,1,0,0,0,0,0,0,0]
i = -1

for rzecz in lista:
    if i < (len(lista) - 1):
        lista[i] = 0
        lista[i+1] = 1

    for litera in lista:
        if litera == 0:
            print(puste, end = '')
        elif litera == 1:
            print(znak, end = '')
    stdout.flush()
    sleep(0.1)
    print("\b" * 100, end = '')
    i += 1
0

@PanamaJoe: "\b" * 100 można by zastąpić po prostu \r

sys.stdout to dobre rozwiązanie, na początku bym sprawdził sys.stdout.isatty(), żeby nie cudować z kursorem gdy użytkownik przekieruje wyjście do pliku.

zamiast os.system('cls') lepiej by było użyć kodów wyjścia terminal "\033[2J". Poniżej kilka innych kodów które mogą się przydać:

print("\033[2J") # czyści cały ekran
print("\033[1;1H")  # skacze do pierwszej linii, pierwszej kolumny
print("\033[?25l") # hide cursor
print("\033[?25h") # show cursor

więcej na https://en.wikipedia.org/wiki/ANSI_escape_code

Tutaj prosta animacja:

from sys import stdout
from time import sleep

stdout.write('  0% [---------------------]')

for i in range(21):
    stdout.write(f'\r{i*5:3}% [' + '='*i + '>')
    stdout.flush()
    sleep(0.1)

print('\033[1D=')

1 użytkowników online, w tym zalogowanych: 0, gości: 1