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?
Unicode hochzählen?
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 = "═│╒╕╘╛"
-
- 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!!
Jetzt schreibe ich den vierstelligen Dezimalcode als Parameter in die chr() und es klappt.
Python ist eben doch das beste!!
-
- 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?
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?
@DerSuchende Wahlweise kannst Du auch einfach Deinen eigenen Raum mit exotischen Unicode-Zeichen aufspannen und mit sprechenderen Bezeichnern belegen, z.B:
oder als Wörterbuch oder Enum. Das macht den Zugriff beim Verketten im Code handlicher als das Rumfummeln mit magischen Indices.
Code: Alles auswählen
LEFT_TOP = '╒'
- 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
Das mit der Klasse sieht etwas hässlich aus. Kann man anders sicherlich schöner machen.
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! │
│ │
│ │
│ │
│ │
└────────────────────────────┘
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Das ganze mit Formatstrings
Ausgabe:
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")
Code: Alles auswählen
╒═══════════ Info ═══════════╕
│ │
│ │
│ │
│ │
│ Hello World! │
│ │
│ │
│ │
╘════════════════════════════╛
-
- 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.
- __blackjack__
- User
- Beiträge: 13119
- 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:
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
#!/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()
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
-
- 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.
Nun habe ich aber wirklich ausreichend Stoff zum nacharbeiten.