mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Co-authored-by: Rodrigo Girão Serrão <5621605+rodrigogiraoserrao@users.noreply.github.com>
233 lines
7.7 KiB
Markdown
233 lines
7.7 KiB
Markdown
<!-- Auto-generated by FAQtory -->
|
|
<!-- Do not edit by hand! -->
|
|
|
|
# Frequently Asked Questions
|
|
- [Does Textual support images?](#does-textual-support-images)
|
|
- [How can I fix ImportError cannot import name ComposeResult from textual.app ?](#how-can-i-fix-importerror-cannot-import-name-composeresult-from-textualapp-)
|
|
- [How can I select and copy text in a Textual app?](#how-can-i-select-and-copy-text-in-a-textual-app)
|
|
- [How do I center a widget in a screen?](#how-do-i-center-a-widget-in-a-screen)
|
|
- [How do I pass arguments to an app?](#how-do-i-pass-arguments-to-an-app)
|
|
- [Why do some key combinations never make it to my app?](#why-do-some-key-combinations-never-make-it-to-my-app)
|
|
- [Why doesn't Textual look good on macOS?](#why-doesn't-textual-look-good-on-macos)
|
|
- [Why doesn't Textual support ANSI themes?](#why-doesn't-textual-support-ansi-themes)
|
|
|
|
<a name="does-textual-support-images"></a>
|
|
## Does Textual support images?
|
|
|
|
Textual doesn't have built in support for images yet, but it is on the [Roadmap](https://textual.textualize.io/roadmap/).
|
|
|
|
See also the [rich-pixels](https://github.com/darrenburns/rich-pixels) project for a Rich renderable for images that works with Textual.
|
|
|
|
<a name="how-can-i-fix-importerror-cannot-import-name-composeresult-from-textualapp-"></a>
|
|
## How can I fix ImportError cannot import name ComposeResult from textual.app ?
|
|
|
|
You likely have an older version of Textual. You can install the latest version by adding the `-U` switch which will force pip to upgrade.
|
|
|
|
The following should do it:
|
|
|
|
```
|
|
pip install "textual[dev]" -U
|
|
```
|
|
|
|
<a name="how-can-i-select-and-copy-text-in-a-textual-app"></a>
|
|
## How can I select and copy text in a Textual app?
|
|
|
|
Running a Textual app puts your terminal in to *application mode* which disables clicking and dragging to select text.
|
|
Most terminal emulators offer a modifier key which you can hold while you click and drag to restore the behavior you
|
|
may expect from the command line. The exact modifier key depends on the terminal and platform you are running on.
|
|
|
|
- **iTerm** Hold the OPTION key.
|
|
- **Gnome Terminal** Hold the SHIFT key.
|
|
- **Windows Terminal** Hold the SHIFT key.
|
|
|
|
Refer to the documentation for your terminal emulator, if it is not listed above.
|
|
|
|
<a name="how-do-i-center-a-widget-in-a-screen"></a>
|
|
## How do I center a widget in a screen?
|
|
|
|
To center a widget within a container use
|
|
[`align`](https://textual.textualize.io/styles/align/). But remember that
|
|
`align` works on the *children* of a container, it isn't something you use
|
|
on the child you want centered.
|
|
|
|
For example, here's an app that shows a `Button` in the middle of a
|
|
`Screen`:
|
|
|
|
```python
|
|
from textual.app import App, ComposeResult
|
|
from textual.widgets import Button
|
|
|
|
class ButtonApp(App):
|
|
|
|
CSS = """
|
|
Screen {
|
|
align: center middle;
|
|
}
|
|
"""
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield Button("PUSH ME!")
|
|
|
|
if __name__ == "__main__":
|
|
ButtonApp().run()
|
|
```
|
|
|
|
If you use the above on multiple widgets, you'll find they appear to
|
|
"left-align" in the center of the screen, like this:
|
|
|
|
```
|
|
+-----+
|
|
| |
|
|
+-----+
|
|
|
|
+---------+
|
|
| |
|
|
+---------+
|
|
|
|
+---------------+
|
|
| |
|
|
+---------------+
|
|
```
|
|
|
|
If you want them more like this:
|
|
|
|
```
|
|
+-----+
|
|
| |
|
|
+-----+
|
|
|
|
+---------+
|
|
| |
|
|
+---------+
|
|
|
|
+---------------+
|
|
| |
|
|
+---------------+
|
|
```
|
|
|
|
the best approach is to wrap each widget in a container that individually
|
|
centers it. For example:
|
|
|
|
```python
|
|
from textual.app import App, ComposeResult
|
|
from textual.containers import Container
|
|
from textual.widgets import Button
|
|
|
|
class Center( Container ):
|
|
DEFAULT_CSS = """
|
|
Center {
|
|
height: auto;
|
|
width: 100%;
|
|
align: center middle;
|
|
}
|
|
"""
|
|
|
|
class ButtonApp(App):
|
|
|
|
CSS = """
|
|
Screen {
|
|
align: center middle;
|
|
}
|
|
"""
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield Center(Button("PUSH ME!"))
|
|
yield Center(Button("AND ME!"))
|
|
yield Center(Button("ALSO PLEASE PUSH ME!"))
|
|
yield Center(Button("HEY ME ALSO!!"))
|
|
|
|
if __name__ == "__main__":
|
|
ButtonApp().run()
|
|
```
|
|
|
|
<a name="how-do-i-pass-arguments-to-an-app"></a>
|
|
## How do I pass arguments to an app?
|
|
|
|
When creating your `App` class, override `__init__` as you would when
|
|
inheriting normally. For example:
|
|
|
|
```python
|
|
from textual.app import App, ComposeResult
|
|
from textual.widgets import Static
|
|
|
|
class Greetings(App[None]):
|
|
|
|
def __init__(self, greeting: str="Hello", to_greet: str="World") -> None:
|
|
self.greeting = greeting
|
|
self.to_greet = to_greet
|
|
super().__init__()
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield Static(f"{self.greeting}, {self.to_greet}")
|
|
```
|
|
|
|
Then the app can be run, passing in various arguments; for example:
|
|
|
|
```python
|
|
# Running with default arguments.
|
|
Greetings().run()
|
|
|
|
# Running with a keyword arguyment.
|
|
Greetings(to_greet="davep").run()
|
|
|
|
# Running with both positional arguments.
|
|
Greetings("Well hello", "there").run()
|
|
```
|
|
|
|
<a name="why-do-some-key-combinations-never-make-it-to-my-app"></a>
|
|
## Why do some key combinations never make it to my app?
|
|
|
|
Textual can only ever support key combinations that are passed on by your
|
|
terminal application. Which keys get passed on can differ from terminal to
|
|
terminal, and from operating system to operating system.
|
|
|
|
Because of this it's best to stick to key combinations that are known to be
|
|
universally-supported; these include:
|
|
|
|
- Letters
|
|
- Numbers
|
|
- Numbered function keys (especially F1 through F10)
|
|
- Space
|
|
- Return
|
|
- Arrow, home, end and page keys
|
|
- Control
|
|
- Shift
|
|
|
|
When [creating bindings for your
|
|
application](https://textual.textualize.io/guide/input/#bindings) we
|
|
recommend picking keys and key combinations from the above.
|
|
|
|
Keys that aren't normally passed through by terminals include Cmd and Option
|
|
on macOS, and the Windows key on Windows.
|
|
|
|
If you need to test what [key
|
|
combinations](https://textual.textualize.io/guide/input/#keyboard-input)
|
|
work in different environments you can try them out with `textual keys`.
|
|
|
|
<a name="why-doesn't-textual-look-good-on-macos"></a>
|
|
## Why doesn't Textual look good on macOS?
|
|
|
|
The default macOS `Terminal.app` is getting rather old now; it has problems
|
|
such as being limited to just 256 colors, being slow to draw and not all
|
|
box-drawing characters are fully-supported. We recommend installing a newer
|
|
terminal such as [iTerm2](https://iterm2.com/),
|
|
[Kitty](https://sw.kovidgoyal.net/kitty/) or
|
|
[WezTerm](https://wezfurlong.org/wezterm/).
|
|
|
|
<a name="why-doesn't-textual-support-ansi-themes"></a>
|
|
## Why doesn't Textual support ANSI themes?
|
|
|
|
Textual will not generate escape sequences for the 16 themeable *ANSI* colors.
|
|
|
|
This is an intentional design decision we took for for the following reasons:
|
|
|
|
- Not everyone has a carefully chosen ANSI color theme. Color combinations which may look fine on your system, may be unreadable on another machine. There is very little an app author or Textual can do to resolve this. Asking users to simply pick a better theme is not a good solution, since not all users will know how.
|
|
- ANSI colors can't be manipulated in the way Textual can do with other colors. Textual can blend colors and produce light and dark shades from an original color, which is used to create more readable text and user interfaces. Color blending will also be used to power future accessibility features.
|
|
|
|
Textual has a design system which guarantees apps will be readable on all platforms and terminals, and produces better results than ANSI colors.
|
|
|
|
There is currently a light and dark version of the design system, but more are planned. It will also be possible for users to customize the source colors on a per-app or per-system basis. This means that in the future you will be able to modify the core colors to blend in with your chosen terminal theme.
|
|
|
|
<hr>
|
|
|
|
Generated by [FAQtory](https://github.com/willmcgugan/faqtory) |