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...
Kolejny print w tej samej linijce
- Rejestracja: dni
- Ostatnio: dni
- Postów: 25
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Nie używać print tylko bezpośrednio jakiegoś sys.stdout.write() na przykład?
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
Daj print() przed sleepem.
- Rejestracja: dni
- Ostatnio: dni
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()
- Rejestracja: dni
- Ostatnio: dni
- Postów: 25
wiem, dałem i działa...
Muszę tylko przemyśleć, dlaczego...
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- 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=')