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...
- Rejestracja:około 5 lat
- Ostatnio:około 2 lata
- Postów:25

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Nie używać print tylko bezpośrednio jakiegoś sys.stdout.write()
na przykład?

- Rejestracja:ponad 4 lata
- Ostatnio:około 3 lata
- Postów:310
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.
- Rejestracja:około 5 lat
- Ostatnio:około 2 lata
- Postów:25
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...

- Rejestracja:prawie 18 lat
- Ostatnio:ponad rok
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)
- Rejestracja:około 5 lat
- Ostatnio:około 2 lata
- Postów:25
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.

- Rejestracja:ponad 4 lata
- Ostatnio:około 3 lata
- Postów:310
irokura napisał(a):
wiem, dałem i działa...
Muszę tylko przemyśleć, dlaczego.
Nie napisałeś, jak odpalasz w PyCharmie - są 3 opcje:
- zielonym guzikiem
- w okienku terminala
- 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
- Rejestracja:ponad 6 lat
- Ostatnio:około 2 miesiące
- Postów:242
@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=')
Shalom