Soru Terminalde renkler ile yazdırılsın mı?


Python'da terminale nasıl renkli bir metin verebilirim? Sağlam bir bloğu temsil eden en iyi Unicode sembolü nedir?


1520
2017-11-13 18:58


Menşei


Daha iyi yanıt almak için bazı ek bilgiler belirtmelisiniz: multiplatform? harici modüller kabul edilir mi? - sorin
IPython bunu yapar, çapraz platform. Ne kullandığını gördün mü? - endolith
Bu sembol harika bir renkli blok yapar: █   Tek sorun, ASCII'nin genişletilmesi, belki de bunu kullanarak çalışmaya başlayabilmesidir. http://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python - Samy Bencherif
Bazı terminaller Unicode karakterlerini de görüntüleyebilir. Terminaliniz için bu doğruysa, olası karakterler neredeyse sınırsızdır. - ayke
Bu cevap oldukça geç geldi, ama benim için en iyisi gibi görünüyor ... yukarıda oylananlar Windows için özel hack gerektirirken, bu sadece çalışır: stackoverflow.com/a/3332860/901641 - ArtOfWarfare


Cevaplar:


Bu biraz, hangi platformda olduğunuza bağlı. Bunu yapmanın en yaygın yolu, ANSI çıkış sıralarını basmaktır. Basit bir örnek için, buradan bazı python kodları blender inşa komut dosyaları:

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

Böyle bir kodu kullanmak için,

print bcolors.WARNING + "Warning: No active frommets remain. Continue?" 
      + bcolors.ENDC

Bu OS X, linux ve pencereler de dahil olmak üzere unixes üzerinde çalışacaktır ANSICONveya Windows 10'da etkinleştirdiğiniz sürece VT100 emülasyonu). Rengini ayarlamak, imleci hareket ettirmek ve daha fazlası için kodlar vardır.

Eğer bununla karmaşıklaşacaksanız (ve oyun yazıyormuşuz gibi geliyorsa), bunun için karmaşık parçaların birçoğunu ele alan "küfürler" modülüne bakmalısınız. Python Curses nasıl iyi bir tanıtımdır.

Genişletilmiş ASCII kullanmıyorsanız (örn. Bir PC'de değil), 127'nin altında ascii karakterleri ile sıkışmışsınız ve '#' veya '@' muhtemelen bir blok için en iyi bahistir. Terminalinizin bir IBM kullanıyor olduğundan emin olabilirsiniz. genişletilmiş ascii karakter setiDaha fazla seçeneğiniz var. Karakterler 176, 177, 178 ve 219 "blok karakterleri" dir.

"Cüce Kalesi" gibi bazı modern metin tabanlı programlar, grafik modda metin modunu taklit eder ve klasik PC yazı tipinin resimlerini kullanır. Üzerinde kullanabileceğiniz bu bitmaplerden bazılarını bulabilirsiniz. Cüce Kalesi Wiki görmek (kullanıcı yapımı çinileri).

Metin Modu Demo Yarışması Metin modunda grafik yapmak için daha fazla kaynak var.

Hmm .. Bence bu cevabı biraz taşıdım. Yine de destansı bir metin tabanlı bir macera oyunu planlamanın ortasındayım. Renkli metninizle bol şanslar!


1344
2017-11-13 19:25



bu ne disabled için kullanılır? - cregox
@Cawas Bana öyle görünüyor ki, belirli bir renk kullanılarak basılan tüm renkler için renklendirmeyi devre dışı bırakmak gibi. bcolors örneği. Örneğin, bir bcolors Örnek ve sonra renklendirme karakterlerini yazdırmak için örneğinin üye değişkenlerini kullanın, ancak artık renklendirme istemediğinize karar verdiyseniz disable karakterleri yazdırmadan önce boş dizeler olarak yazdırırlar. - Steven Oxley
Sadece belirterek: Ayrıca ekleyebilirsiniz BOLD = "\033[1m" kalın metin istiyorsanız (başlıklar için yararlı). - crazy2be
Linux'ta kullanmak isteyebilirsiniz tput, öyle öyle daha taşınabilir kodla sonuçlandığından. - Martin Ueding
@Cawas: Gerçek kullanım durumu disable çıktıyı bir dosyaya pipettiğinizde; araçlar gibi cat renkleri destekleyebilir, genellikle renk bilgilerini dosyalara yazdırmamak daha iyidir. - Sebastian Mach


Hiç kimsenin bahsettiğine şaşırdım Python termocolor modülü. Kullanımı oldukça basit:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

Bununla birlikte, oyun programlaması ve yapmak istediğiniz "renkli bloklar" için yeterince karmaşık olmayabilir.


556
2017-11-16 07:31



Bu Windows üzerinde çalışıyor mu? - molasses
Evet - Windows'da çalışmıyor ... - stiank81
ANSI kodları yayar, ansi.sys yüklüyse, Windows (DOS konsolları) üzerinde çalışır mı? support.microsoft.com/kb/101875 - Phil P
Sadece 13/01/2011 tarihinden itibaren MIT lisansı altında olduğunu fark ettim. - Alexander Tsepkov
2011'den beri güncellenemeyen (coloramadan farklı) ve unvesests yok - Janus Troelsen


Cevap Colorama Python'daki tüm platformlar arası boyama için.

Bir Python 3.6 örneği ekran görüntüsü: example screenshot


482
2017-07-26 07:07



Colorama'nın yazarı olarak, @ nbv4'ün için teşekkürler. Biraz anlamaya çalışacağım: Colorama, Python programlarının tüm platformlarda renkli terminal metni basmasını ve bu sayfadaki diğer birçok cevapta açıklandığı gibi aynı ANSI kodlarını kullanmasını sağlamayı amaçlamaktadır. Windows'da, Colorama bu ANSI karakterlerini stdout'tan çıkarır ve renkli metin için eşdeğer win32 çağrılarına dönüştürür. Diğer platformlarda, Colorama hiçbir şey yapmaz. Bu nedenle, ANSI kodlarını veya Termcolor gibi modülleri ve Colorama'yı kullanarak, tüm platformlarda 'sadece' çalışırlar. Her neyse, bu fikir. - Jonathan Hartley
Windows üzerinde renkli çıktı istemediğinizde bu kitaplık bir zorunluluktur! - leetNightshade
Bu standart kütüphanede olmalı ... Çapraz platform renk desteği önemli, bence. - daviewales
Colorama harika! Ayrıca bir göz atın ansimarkupcolorama üzerine kurulmuştur ve basit bir etiket tabanlı işaretleme kullanmanıza olanak tanır (ör. <b>bold</b>) Terminal metne stil eklemek için - gvalkov
Bu colorama.init () çağırmadan çalışmaz. Oyvermek! - Smit Johnth


Renk / stil, ardından dizeyi başlatan bir dize yazdırın ve ardından renk / stil değişikliğini sonlandırın. '\x1b[0m':

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

Success with green background example

Aşağıdaki kodla kabuk metni için biçim seçenekleri tablosu alın:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

Açık-koyu örnek (tam)

enter image description here

Işık açık örnek (kısmi)

top part of output


282
2018-02-14 17:56



Çoğu uygulama için yeterince iyi olan ipython gibi kabukların çoğunda çalışır - dashesy
Bu hangi terminali sorabilir miyim? - FlipTack
ne kadar taşınabilir - Ruggero Turra
Bu Ahududu PI 2 üzerinde çalışıyor. Teşekkür ederim! :) - johnerfx
Kısa bağımsız uygulama: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920 - Sheljohn


ANSI kaçış dizileri hakkında bilgi edinmek istersiniz. İşte kısa bir örnek:

CSI="\x1B["
print CSI+"31;40m" + "Colored Text" + CSI + "0m"

Daha fazla bilgi için bkz. http://en.wikipedia.org/wiki/ANSI_escape_code

Bir blok karakteri için, \ u2588 gibi bir unicode karakterini deneyin:

print u"\u2588"

Hepsini bir araya koy:

print CSI+"31;40m" + u"\u2588" + CSI + "0m"

71
2017-11-13 19:22



Deneyin def d(*v): return '\x1B['+';'.join(map(str, v))+'m' sonra print ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)]) - Evgeni Sergeev
Burada sıfırlamanın anlamı nedir? - MohitC
@MohitC: vay. Dokuz yıl ve farkedeceğiniz ilk kişi sizsiniz. Bir hataya benziyor. - Bryan Oakley


Rengi başlatan bir dize ve rengi biten bir dize tanımlayın, ardından metninizi baştaki başlangıç ​​dizesiyle ve sondaki dize ile yazdırın.

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

Bu aşağıdakileri üretir: bash, içinde urxvtZenburn tarzı bir renk düzeni ile:

output colors

Deneme sayesinde daha fazla renk elde edebiliriz:

color matrix

Not: \33[5m ve \33[6m yanıp sönüyor.

Bu şekilde tam renkli bir koleksiyon oluşturabiliriz:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

İşte testi oluşturmak için kod:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5

69
2017-09-12 14:00



txt göz kırpmasını nasıl yaptın? - WiLL_K
Hangi kabuk veya terminal yanıp sönüyor? - Zypps987
(u) örneğin rxvt - qubodup
Yanıp sönen metin gerçekten çok iyi çalışıyor. Nasıl olsa durdurabilirim? Birbirinden ardışık tüm baskılar bir nedenden dolayı yanıp sönüyor. Uçağım parti zamanı olduğunu düşünüyor! - nouveau
Dize sonunda yanıp sönen, koymak \33[0mveya CEND Yukarıdaki. - Stiffy2000


En sevdiğim yol nimetler kütüphane (tam açıklama: yazdım). Örneğin:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

Renkli tuğlaları yazdırmak için, en güvenilir yol, arka plan renkleri olan alanları yazdırmaktır. İlerleme çubuğunu çizmek için bu tekniği kullanıyorum. burun-ilerici:

print t.on_green(' ')

Belirli konumlarda da yazdırabilirsiniz:

with t.location(0, 5):
    print t.on_yellow(' ')

Oyun sırasında diğer terminal yetenekleriyle uğraşmak zorunda kalırsanız, bunu da yapabilirsiniz. Python'un standart dizgi biçimlendirmesini okunabilir durumda tutmak için kullanabilirsiniz:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

Blessings hakkında güzel olan şey, sadece (ezici bir şekilde ortak olan) ANSI-renk olanları değil, her tür terminalde çalışmak için elinden geleni yapmasıdır. Ayrıca, kullanılmaya devam ederken, okunamayan çıkış sıralarını kodunuzun dışında tutar. İyi eğlenceler!


59
2017-12-18 00:32



Bir parametre olarak değil, bir işlev adı olarak rengi koymak tartışmalı bir uygulamadır. - LtWorf
Nimet harikadır! Fonksiyon isminin neden renk olduğunu ve bir parametrenin de olmadığını anlıyorum. - Scalahansolo
@LtWorf: bunu kolayca kullanarak bir parametre haline getirebilirsiniz getattr Eğer ihtiyacın olursa. Veya daha büyük olasılıkla, sadece biçim dizesini dinamik olarak oluşturun. - jfs
@LtWorf: neden? Python'un işlevleri ve yöntemleri birinci sınıf vatandaşlar - progo
@progo yapabildiğiniz gerçeği yapmanız gerektiği anlamına gelmez. Renk, yalnızca geçirebileceğiniz bir parametre ise daha geneldir. - LtWorf