Kolejny print w tej samej linijce

Kolejny print w tej samej linijce
IR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
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...

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

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

SI
  • Rejestracja: dni
  • Ostatnio: dni
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.

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
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.

IR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0
Kopiuj
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...

Arthan
  • Rejestracja: dni
  • Ostatnio: dni
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?

Kopiuj
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)

IR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0
Kopiuj
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.

Arthan
  • Rejestracja: dni
  • Ostatnio: dni
1

Daj print() przed sleepem.

IR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

przecież dałem...

Arthan
  • Rejestracja: dni
  • Ostatnio: dni
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()

IR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

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

Arthan
  • Rejestracja: dni
  • Ostatnio: dni
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.

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
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:

Kopiuj
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
JV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 242
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ć:

Kopiuj
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:

Kopiuj
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=')

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.