Unicode hochzählen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DerSuchende
User
Beiträge: 29
Registriert: Montag 21. Februar 2011, 07:37

Hi, Pythonfreunde!

Ich möchte eine Reihe von Unicode-Zeichen in einer Schleife erzeugen.
Zum Beispiel konnte man mit

for i in range(70,90):
... print(chr(i))

ascii-Zeichen generieren. Habe aber noch keinen Weg gefunden, dies mit
Unicode hinzukriegen. Ich wollte eine Pseudografik generieren und
brauche dazu etliche Blockzeichen wie z.B. so etwas: '╒'
Ich wollte mir ersparen, die alle händisch aufzuschreiben.
Dazu kommt noch das Ärgernis, dass einige meiner Lieblings-Python-Editoren
es nicht zulassen, dass ich mit <str>+<shift>+<u> solche Zeichen schreibe.
(Es gibt aber noch andere, die es doch unterstützen)
Nun meine Frage: Kann man z.B. einen Unicode durch einen Laufindex höher setzen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, das geht mit `chr`. Lesbarer ist es aber, die Zeichen als Konstante direkt im Code stehen zu haben und darauf zuzugreifen.

Code: Alles auswählen

FRAME = "═│╒╕╘╛"
DerSuchende
User
Beiträge: 29
Registriert: Montag 21. Februar 2011, 07:37

Vielen Dank. Ich hatte soviel erfolglos probiert mit Bytecodes und hex(), aber dass es so einfach ist. :-)
Jetzt schreibe ich den vierstelligen Dezimalcode als Parameter in die chr() und es klappt.
Python ist eben doch das beste!!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum überhaupt chr?
DerSuchende
User
Beiträge: 29
Registriert: Montag 21. Februar 2011, 07:37

Ja, warum chr?

1. Wurde es mir doch hier vorgeschlagen.
2. Den Dezimalcode kann ich in meiner Schleife hochzählen und dann
die Unicode-Zeichen haufenweise erzeugen :-)

Übrigens, der Tip mit der Lesbarkeit ist natürlich auch nicht zu verachten. Wenn ich nur wenige
unterschiedliche Zeichen einsetze, ist die zeilenweise Handeingabe wirklich besser.
Aber wenn ich eine Liste von 35 Zeichen hintereinander aufführen will, ist die Schleife doch
naheliegend.
Geht es denn trotzdem noch einfacher oder eleganter?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt doch wissen, welcher Rahmenteil zu welchem Codepoint gehört, da ist doch gar nicht viel mit hochzählen zu machen.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@DerSuchende Wahlweise kannst Du auch einfach Deinen eigenen Raum mit exotischen Unicode-Zeichen aufspannen und mit sprechenderen Bezeichnern belegen, z.B:

Code: Alles auswählen

LEFT_TOP = '╒'
oder als Wörterbuch oder Enum. Das macht den Zugriff beim Verketten im Code handlicher als das Rumfummeln mit magischen Indices.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Man könnte auch mit den Namen der Unicode-Points arbeiten: https://www.sql-und-xml.de/unicode-data ... awing.html

Code: Alles auswählen

import unicodedata


class Box:
    LEFT_TOP = unicodedata.lookup("BOX DRAWINGS LIGHT DOWN AND RIGHT")
    RIGHT_TOP = unicodedata.lookup("BOX DRAWINGS LIGHT DOWN AND LEFT")
    LEFT_BOTTOM = unicodedata.lookup("BOX DRAWINGS LIGHT UP AND RIGHT")
    RIGHT_BOTTOM = unicodedata.lookup("BOX DRAWINGS LIGHT UP AND LEFT")
    V = unicodedata.lookup("BOX DRAWINGS LIGHT VERTICAL")
    H = unicodedata.lookup("BOX DRAWINGS LIGHT HORIZONTAL")


def make_box(x, y, text):
    x -= 2
    y -= 2
    y_half = y // 2
    
    print(Box.LEFT_TOP + (Box.H * x) + Box.RIGHT_TOP)

    for _ in range(y_half):
        print(Box.V + " " * x + Box.V)

    print(Box.V + text[:x].center(x) + Box.V)

    for _ in range(y_half):
        print(Box.V + " " * x + Box.V)

    print(Box.LEFT_BOTTOM + (Box.H * x) + Box.RIGHT_BOTTOM)
    
    make_box(30, 10, "Hello World!")
    

Code: Alles auswählen

┌────────────────────────────┐
│                            │
│                            │
│                            │
│                            │
│        Hello World!        │
│                            │
│                            │
│                            │
│                            │
└────────────────────────────┘
Das mit der Klasse sieht etwas hässlich aus. Kann man anders sicherlich schöner machen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ganze mit Formatstrings

Code: Alles auswählen

def make_box(width, height, text, title="", box=["╒═╕", "│ │", "╘═╛"]):
    FRAME = "{2}{1:{3}^{0}.{0}}{4}"
    width -= 2
    height -= 2
    half_height = height // 2
    print(FRAME.format(width, title, *box[0]))
    for y in range(height):
        output = text if y == half_height else ''
        print(FRAME.format(width, output, *box[1]))
    print(FRAME.format(width, '', *box[2]))

make_box(30, 10, "Hello World!", "Info")
Ausgabe:

Code: Alles auswählen

╒═══════════ Info ═══════════╕
│                            │
│                            │
│                            │
│                            │
│        Hello World!        │
│                            │
│                            │
│                            │
╘════════════════════════════╛
DerSuchende
User
Beiträge: 29
Registriert: Montag 21. Februar 2011, 07:37

Uff, da habt ihr mir ja auf die schnelle ein paar interessante Türklinken gezeigt, wo ich noch nicht mal wusste, dass da Türen sind. Die muss ich mal in Ruhe und nacheinander selbst öffnen und dahinter schauen- Mein Ausgangspunkt war ja die Faulheit des Programmierers, der auf die schnelle über weite Codebereiche sich ungeduldig einen Überblick verschaffen wollte, welche Symbole sich so dahinter verstecken, um dass suchen und durchmustern vieler Tabellen einzusparen. Aber jetzt hast Du mich natürlich sofort wieder in Richtung einer echten Python-Denke gestubst, die maximale Eleganz anstrebt. Über das Modul unicodedata war ich noch gar nicht gestolpert. Werde ich aber schnell nachholen, scheint ja 'ne Menge dahinterzustecken. Also nochmal vielen Dank für die Erleuchtung. Auch wenn man schon lange von Python begeistert ist, so macht es jedes mal Spaß, neue Facetten zu entdecken und davon gibt es noch so viele, und sie werden immer mehr.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DerSuchende: Stichpunkt Faulheit des Programmierers: Bibliotheken. Zum Beispiel `rich` mit der Ausgabe vom Beispiel von Sirius3:

Code: Alles auswählen

#!/usr/bin/env python3
import rich
from rich.align import Align
from rich.box import Box
from rich.panel import Panel

BOX = Box(
    """\
╒═╤╕
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
╘═╧╛
"""
)


def main():
    rich.print(
        Panel(
            Align("Hello World!", "center", vertical="middle"),
            BOX,
            title="Info",
            width=30,
            height=10,
        )
    )


if __name__ == "__main__":
    main()
Die Box-Zeichen muss man nur selbst definieren, wenn einem die Konstanten, die es in der Bibliothek schon gibt, nicht ausreichen:

Code: Alles auswählen

$ python3 -m rich.box
                               ╭───────────────╮                                
                               │ Box Constants │                                
                               ╰───────────────╯                                

        box.ASCII                   box.ASCII2           box.ASCII_DOUBLE_HEAD  
+------------------------+  +------------+-----------+  +-----------+----------+
| Header 1   | Header 2  |  | Header 1   | Header 2  |  | Header 1  | Header 2 |
|------------+-----------|  +------------+-----------+  +===========+==========+
| Cell       | Cell      |  | Cell       | Cell      |  | Cell      | Cell     |
| Cell       | Cell      |  | Cell       | Cell      |  | Cell      | Cell     |
|------------+-----------|  +------------+-----------+  +-----------+----------+
| Footer 1   | Footer 2  |  | Footer 1   | Footer 2  |  | Footer 1  | Footer 2 |
+------------------------+  +------------+-----------+  +-----------+----------+
                                                                                
                                                                                
        box.DOUBLE               box.DOUBLE_EDGE               box.HEAVY        
╔════════════╦═══════════╗  ╔════════════╤═══════════╗  ┏━━━━━━━━━━━┳━━━━━━━━━━┓
║ Header 1   ║ Header 2  ║  ║ Header 1   │ Header 2  ║  ┃ Header 1  ┃ Header 2 ┃
╠════════════╬═══════════╣  ╟────────────┼───────────╢  ┣━━━━━━━━━━━╋━━━━━━━━━━┫
║ Cell       ║ Cell      ║  ║ Cell       │ Cell      ║  ┃ Cell      ┃ Cell     ┃
║ Cell       ║ Cell      ║  ║ Cell       │ Cell      ║  ┃ Cell      ┃ Cell     ┃
╠════════════╬═══════════╣  ╟────────────┼───────────╢  ┣━━━━━━━━━━━╋━━━━━━━━━━┫
║ Footer 1   ║ Footer 2  ║  ║ Footer 1   │ Footer 2  ║  ┃ Footer 1  ┃ Footer 2 ┃
╚════════════╩═══════════╝  ╚════════════╧═══════════╝  ┗━━━━━━━━━━━┻━━━━━━━━━━┛
                                                                                
                                                                                
      box.HEAVY_EDGE              box.HEAVY_HEAD            box.HORIZONTALS     
┏━━━━━━━━━━━━┯━━━━━━━━━━━┓  ┏━━━━━━━━━━━━┳━━━━━━━━━━━┓   ────────────────────── 
┃ Header 1   │ Header 2  ┃  ┃ Header 1   ┃ Header 2  ┃    Header 1    Header 2  
┠────────────┼───────────┨  ┡━━━━━━━━━━━━╇━━━━━━━━━━━┩   ────────────────────── 
┃ Cell       │ Cell      ┃  │ Cell       │ Cell      │    Cell        Cell      
┃ Cell       │ Cell      ┃  │ Cell       │ Cell      │    Cell        Cell      
┠────────────┼───────────┨  ├────────────┼───────────┤   ────────────────────── 
┃ Footer 1   │ Footer 2  ┃  │ Footer 1   │ Footer 2  │    Footer 1    Footer 2  
┗━━━━━━━━━━━━┷━━━━━━━━━━━┛  └────────────┴───────────┘   ────────────────────── 
                                                                                
                                                                                
       box.MINIMAL           box.MINIMAL_DOUBLE_HEAD     box.MINIMAL_HEAVY_HEAD 
             ╷                           ╷                          ╷           
  Header 1   │ Header 2       Header 1   │ Header 2       Header 1  │ Header 2  
╶────────────┼───────────╴   ════════════╪═══════════   ╺━━━━━━━━━━━┿━━━━━━━━━━╸
  Cell       │ Cell           Cell       │ Cell           Cell      │ Cell      
  Cell       │ Cell           Cell       │ Cell           Cell      │ Cell      
╶────────────┼───────────╴   ────────────┼───────────   ╶───────────┼──────────╴
  Footer 1   │ Footer 2       Footer 1   │ Footer 2       Footer 1  │ Footer 2  
             ╵                           ╵                          ╵           
                                                                                
                                                                                
       box.ROUNDED                  box.SIMPLE              box.SIMPLE_HEAD     
╭────────────┬───────────╮                                                      
│ Header 1   │ Header 2  │    Header 1     Header 2       Header 1    Header 2  
├────────────┼───────────┤   ────────────────────────    ────────────────────── 
│ Cell       │ Cell      │    Cell         Cell           Cell        Cell      
│ Cell       │ Cell      │    Cell         Cell           Cell        Cell      
├────────────┼───────────┤   ────────────────────────                           
│ Footer 1   │ Footer 2  │    Footer 1     Footer 2       Footer 1    Footer 2  
╰────────────┴───────────╯                                                      
                                                                                
                                                                                
     box.SIMPLE_HEAVY               box.SQUARE           box.SQUARE_DOUBLE_HEAD 
                            ┌────────────┬───────────┐  ┌───────────┬──────────┐
  Header 1     Header 2     │ Header 1   │ Header 2  │  │ Header 1  │ Header 2 │
 ━━━━━━━━━━━━━━━━━━━━━━━━   ├────────────┼───────────┤  ╞═══════════╪══════════╡
  Cell         Cell         │ Cell       │ Cell      │  │ Cell      │ Cell     │
  Cell         Cell         │ Cell       │ Cell      │  │ Cell      │ Cell     │
 ━━━━━━━━━━━━━━━━━━━━━━━━   ├────────────┼───────────┤  ├───────────┼──────────┤
  Footer 1     Footer 2     │ Footer 1   │ Footer 2  │  │ Footer 1  │ Footer 2 │
                            └────────────┴───────────┘  └───────────┴──────────┘
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DerSuchende
User
Beiträge: 29
Registriert: Montag 21. Februar 2011, 07:37

Es ist nicht zu fassen, es wird immer besser :-)
Nun habe ich aber wirklich ausreichend Stoff zum nacharbeiten.
Antworten