[gelöst] Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

[gelöst] Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 08:25:55

Hallo Gemeinde,

ich habe mich mit Python3 und Tkinter ganz gut in die GUI Programmierung eingearbeitet. Es gibt im Netz ja auch ganz gute Tutorials und die dazugehörige Api. Ich habe mich an einen Texteditor gewagt und das hat auch wirklich gut funktioniert. Allerdings bekomme ich es nicht hin, dem Textwidget eine vertikale Scrollbar zu verpassen, obwohl ich mir einige Beispiele angesehen und auch danach recherchiert habe. Eine horizontale Scrollbar ist meineserachtens nicht nötig, da ich wordwrap einsetze. Nun seid Ihr meine letzte Hoffnung, vielleicht gibt es ja den einen oder anderen unter Euch, der Erfahrungen mit Python und Tkinter hat und mir deshalb helfen kann. Ich stell den Sourcecode hier mal Online:

Code: Alles auswählen

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""
Created on Sat Jul  3 10:48:09 2021

@author: ralph
"""

import tkinter as tk

from tkinter.filedialog import askopenfilename, asksaveasfilename
  
def open_file():
    """Datei öffnen."""
    filepath = askopenfilename(
        filetypes=[("Text Dateien", "*.txt"), ("Alle Dateien", "*.*")]
    )
    if not filepath:
        return
    txt_edit.delete(1.0, tk.END)
    with open(filepath, "r") as input_file:
        text = input_file.read()
        txt_edit.insert(tk.END, text)
        txt_edit.focus_set()
    app.title(f"Text Editor Application - {filepath}")
 
def save_file():
    """Datei speichern."""
    filepath = asksaveasfilename(
        defaultextension=".txt",
        filetypes=[("Text Dateien", "*.txt"), ("Alle Dateien", "*.*")],
    )
    if not filepath:
        return
    with open(filepath, "w") as output_file:
        text = txt_edit.get(1.0, tk.END)
        output_file.write(text)
    app.title(f"Text Editor Application - {filepath}")    
 
app = tk.Tk() 
app.geometry('600x400')
app.title("TK - Editor")

menubar = tk.Menu(app)

filemenu = tk.Menu(menubar,tearoff=0)

filemenu.add_command(label="Öffnen...", command=open_file)

filemenu.add_command(label="Speichern", command=save_file)

filemenu.add_command(label="Beenden", command=app.destroy)

menubar.add_cascade(label="Datei", menu=filemenu)

app.config(menu=menubar)

txt_edit = tk.Text(app)

txt_edit.focus_set()

txt_edit.configure(background="white")

txt_edit.pack(fill='both', expand=1)

app.mainloop()

Danke!

Gruß ralli
Zuletzt geändert von ralli am 08.07.2021 07:06:54, insgesamt 1-mal geändert.
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

schwedenmann
Beiträge: 5525
Registriert: 30.12.2004 15:31:07
Wohnort: Wegberg

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von schwedenmann » 06.07.2021 08:36:05

Hallo

Sowas wiie hier meinst du ?

https://www.python-forum.de/viewtopic.php?t=37152

mfg
schwedenmann

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 08:49:45

schwedenmann hat geschrieben: ↑ zum Beitrag ↑
06.07.2021 08:36:05
Hallo

Sowas wiie hier meinst du ?

https://www.python-forum.de/viewtopic.php?t=37152

mfg
schwedenmann
Danke genau so. Jetzt muß ich es nur noch in meinen Code einarbeiten, mal sehen, ob es funktioniert. Ich habe noch ein Verständnisproblem. Ich habe in meinem Code ja nur ein Text Widget. Muß ich das auf einen Frame oder Canvas packen, oder kann ich auch direkt eine Scrollbar dem Text Widget hinzufügen? Nun, ich probier es aus ....

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

Huo
Beiträge: 605
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von Huo » 06.07.2021 09:21:32

Am einfachsten spendierst Du Deinem Editor eine Scrollbar mit Hilfe des Moduls tkinter.scrolledtext.

Importiere das Modul per

Code: Alles auswählen

import tkinter.scrolledtext
und ersetzte in Deinem Code die Zeile "txt_edit = tk.Text(app)" durch

Code: Alles auswählen

txt_edit = tk.scrolledtext.ScrolledText(app)

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von tobo » 06.07.2021 10:12:10

ralli hat geschrieben: ↑ zum Beitrag ↑
06.07.2021 08:49:45
Ich habe noch ein Verständnisproblem. Ich habe in meinem Code ja nur ein Text Widget. Muß ich das auf einen Frame oder Canvas packen, oder kann ich auch direkt eine Scrollbar dem Text Widget hinzufügen? Nun, ich probier es aus ....
Die Scrollbar ist dem Fenster (app) untergeordnet; Für die Funktionaliät wird die Scrollbar mit dem Text-Widget verknüpft, und zwar in beide Richtungen:

Code: Alles auswählen

...
app.config(menu=menubar)

scroll=tk.Scrollbar(app)  ##Edit
scroll.pack(side=tk.RIGHT, fill=tk.Y)  ##Edit
txt_edit = tk.Text(app, yscrollcommand=scroll.set)  ##Edit

txt_edit.focus_set()

txt_edit.configure(background="white")

txt_edit.pack(fill='both', expand=1)

scroll.config(command=txt_edit.yview)  ##Edit

app.mainloop()

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 10:38:40

Chapeau!, Euch beiden, beides funktioniert einwandfrei. Der Code von @Hui ist am einfachsten, beim Code von @Tobi habe ich aber auch hinzu gelernt, gut für das Verständnis. Jetzt möchte ich dem Textwidget noch Ränder hinzufügen (oben, unten,links und rechts) kenne die Befehle aber nicht, irgendwas mix xpad, ypad oder padding ..... ? Sieht dann irgendwie besser aus. Ja, ich muß noch einiges lernen, aber es macht mir Spaß. Ist im Netz recht gut dokumentiert, aber nicht immer verständlich ausgedrückt. Und viele Beispiele sind leider nur halbgar. Also, nochmals vielen Dank, ich brauchte mal ein Erfolgserlebnis, sonst wird es an der einen oder anderen Stelle auch mal frustrierend. Aber im Ruhestand habe ich ja gottlob Zeit ohne Ende.

Grüße ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von tobo » 06.07.2021 11:35:11

padx und pady (in Pixel):

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, yscrollcommand=scroll.set)

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 16:41:40

tobo hat geschrieben: ↑ zum Beitrag ↑
06.07.2021 11:35:11
padx und pady (in Pixel):

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, yscrollcommand=scroll.set)
Hallo @tobo, Du bist der Held, danke.

Selber hatte ich folgenden Code eingebaut:

Code: Alles auswählen

txt_edit.config (padx = 20)

txt_edit.config (pady = 20)
Wäre wahrscheinlich auch in einer Zeile gegangen, oder? Wie Du siehst stehe ich noch am Anfang, aber es wird täglich besser. Coden, coden und nochmals coden und viele Beispiele durcharbeiten.

Zu dieser Zeile Code:

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, yscrollcommand=scroll.set)
habe ich noch eine Frage, wenn es erlaubt ist?

Ich möchte noch die Funktion für einen Wortumbruch am Ende einer Zeile in dieser Zeile einbauen. Dazu habe ich

Code: Alles auswählen

import textwrap
eingeben und folgendes in Deiner Zeile eingebaut:

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, wrap=WORD, yscrollcommand=scroll.set)
Leider funktioniert das nicht. Es kommt die Fehlermeldung:

Code: Alles auswählen

NameError: name 'WORD' is not defined
Ich schätze, ich muß noch viel lernen .... Kannst Du mir bitte noch einmal helfen? Danke!

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von tobo » 06.07.2021 17:19:05

ralli hat geschrieben: ↑ zum Beitrag ↑
06.07.2021 16:41:40
Selber hatte ich folgenden Code eingebaut:

Code: Alles auswählen

txt_edit.config (padx = 20)

txt_edit.config (pady = 20)
Wäre wahrscheinlich auch in einer Zeile gegangen, oder? Wie Du siehst stehe ich noch am Anfang, aber es wird täglich besser. Coden, coden und nochmals coden und viele Beispiele durcharbeiten.
Ja, hätte in eine Zeile gepasst. Man hätte aber eher nicht config oder configure dafür benutzt - die sind dafür da, um Optionen zu aktualisieren. Das Widget wird daraufhin dann neu konfiguriert. Wenn man es aber direkt erledigen kann, dan benutzt man dafür den Konstruktor.
Zu dieser Zeile Code:

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, yscrollcommand=scroll.set)
habe ich noch eine Frage, wenn es erlaubt ist?

Ich möchte noch die Funktion für einen Wortumbruch am Ende einer Zeile in dieser Zeile einbauen. Dazu habe ich

Code: Alles auswählen

import textwrap
eingeben und folgendes in Deiner Zeile eingebaut:

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, wrap=WORD, yscrollcommand=scroll.set)
Leider funktioniert das nicht. Es kommt die Fehlermeldung:

Code: Alles auswählen

NameError: name 'WORD' is not defined
Wozu benötigst du dabei textwrap? Was WORD angeht - das ist unbekannt, da nicht mit tk qualifiziert.

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, wrap=tk.WORD, yscrollcommand=scroll.set)
Das ist immer davon abhängig, wie du tkinter importierst.

Code: Alles auswählen

import tkinter         ## tkinter.WORD
from tkinter import *  ## WORD
import tkinter as tk   ## tk.WORD

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 17:49:54

Hallo, Du warst schneller. Textwrap wird überhaupt nicht benötigt. Das war ein Denkfehler. Ich war schon auf dem richtigen Weg, es war bei mir lediglich ein Tippfehler. Diese Zeile Code funktionier bei mir einwandfrei:

Code: Alles auswählen

txt_edit = tk.Text(app, padx=20, pady=20, wrap="word", yscrollcommand=scroll.set
Danke für Deine schnelle Hilfe und Unterstützung. Bin halt noch im Lernmodus.

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 18:11:59

So, die ersten Hürden sind geschafft. Der Editor ist ja noch nicht fertig. Ein paar Aufgaben müssen noch gemeistert werden:
Im Menü der Menüpunkt Bearbeiten mit den Menüpunkten Ausschneiden, Kopieren, Einfügen und alles auswhlen. Dann unten eine Statusleiste einbauen mit Counter, der die Informationen in Echtzeit liefert, an welcher Position ich mich im Text befinde, also in welcher Zeile und Spalte. Bestimmt fällt mir noch was ein. Die Codeschnippsel im Netz sind leider meistens abgespeckt. Das mag für die Basics reichen, für richtige Projekte benötigt es mehr Kompetenz. Es gibt viel zu tun, ergo packe ich es an ...

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von tobo » 06.07.2021 18:45:47

tkinter.WORD ist ein alias für 'word'. Genauer gesagt ist in "/usr/lib/python3.7/tkinter/constants.py" die symbolische Konstante WORD mit 'word' belegt. Genauso wie übrigens Y='y' und END='end' dort definiert ist.
Ich würde immer die symbolische Konstante vorziehen, den String zu verwenden ist aber auch legitim. Nur beide Formen mischen, das würde ich eher nicht...

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 06.07.2021 19:39:36

tobo hat geschrieben: ↑ zum Beitrag ↑
06.07.2021 18:45:47
tkinter.WORD ist ein alias für 'word'. Genauer gesagt ist in "/usr/lib/python3.7/tkinter/constants.py" die symbolische Konstante WORD mit 'word' belegt. Genauso wie übrigens Y='y' und END='end' dort definiert ist.
Ich würde immer die symbolische Konstante vorziehen, den String zu verwenden ist aber auch legitim. Nur beide Formen mischen, das würde ich eher nicht...
Danke für die Informationen, ich werde mich Stück für Stück einarbeiten. Auf jedenfall ist es doch umfangreicher, als ich dachte. Aber es macht mir Spaß, Python mit Tkinter, da braucht es kein QT oder GTK, obwohl es da ja auch Bindungen gibt. Wenn der Editor ganz fertig ist, möchte ich einen Musikplayer für Online Radio machen. Da können dann die Streamadressen von Lieblingssendern in einer sqlite Datenbank abgespeichert werden und jederzeit abgespielt werden. Ich finde, das eine neue Sprache am schnellsten erlernt werden kann, wenn man sich Aufgaben stellt.

So für heute ist Schluß, denn es wird ja ein Fußballabend .... mein Favorit ist Italien....

Grüße ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 07.07.2021 08:29:18

Hallo @tobo, Du hast Dir ja ein kompetentes Wissen angeeignet und erarbeitet. Mit Recherche allein wird dieses Ziel nicht zu erreichen sein. Könntest Du mir bitte verraten, ob und welche Literatur (Fachbücher) Dir dabei geholfen haben und welches Buch Du mir empfehlen kannst? Danke.

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von tobo » 07.07.2021 11:21:01

Ich kann dir nicht wirklich ein Buch dazu empfehlen!? Selbst habe ich das weitestgehend aus Vorlesungsskripten erlernt. Mir ging es dann auch eher um eine Sprachreferenz und nicht um ein Lehrbuch. Was du dir aber mal anschauen könntest, wäre diese Seite:
https://www.python-kurs.eu/python3_kurs.php
Die ersten drei Kapitel Python Tutorial/OOP/Fortgeschrittene (und Teile von Anwendungen) gibt's auch in Buchform (Bernd Klein: "Einführung in Python 3"; es gibt mit "Numerisches Python" noch ein weiteres Buch). Ich bin auch der Meinung, dass man diese Themen gut kennen sollte, bevor man GUI-Oberflächen erstellt. Wenn du von Delphi/Laazarus kommst, dann weißt du ja auch, dass GUI-Entwicklung in Python nicht die Leuchtturmkompetenz ist!? Das Tkinter-Kapitel ist aber trotzdem besser, als sich die Information (ohne Leitfaden) irgendwo stückweise raussuchen zu müssen. Ich hänge die GUI aber nicht so hoch und würde GUI-Entwicklung auch eher zweitrangig bewerten, genauso wie das absolute Muss einer IDE zur Entwicklung.
Bücher, die dann eher fortgeschrittene Themen behandeln und die ich empfehlen kann: Slatkin: "Effektiv Python programmieren" und Ramalho: "Fluent Python" (Englisch). Allerdings wird in beiden Büchern kein Wort über GUI-Entwicklung verloren.

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 07.07.2021 11:40:03

tobo hat geschrieben: ↑ zum Beitrag ↑
07.07.2021 11:21:01
Ich kann dir nicht wirklich ein Buch dazu empfehlen!? Selbst habe ich das weitestgehend aus Vorlesungsskripten erlernt. Mir ging es dann auch eher um eine Sprachreferenz und nicht um ein Lehrbuch. Was du dir aber mal anschauen könntest, wäre diese Seite:
https://www.python-kurs.eu/python3_kurs.php
Die ersten drei Kapitel Python Tutorial/OOP/Fortgeschrittene (und Teile von Anwendungen) gibt's auch in Buchform (Bernd Klein: "Einführung in Python 3"; es gibt mit "Numerisches Python" noch ein weiteres Buch). Ich bin auch der Meinung, dass man diese Themen gut kennen sollte, bevor man GUI-Oberflächen erstellt. Wenn du von Delphi/Laazarus kommst, dann weißt du ja auch, dass GUI-Entwicklung in Python nicht die Leuchtturmkompetenz ist!? Das Tkinter-Kapitel ist aber trotzdem besser, als sich die Information (ohne Leitfaden) irgendwo stückweise raussuchen zu müssen. Ich hänge die GUI aber nicht so hoch und würde GUI-Entwicklung auch eher zweitrangig bewerten, genauso wie das absolute Muss einer IDE zur Entwicklung.
Bücher, die dann eher fortgeschrittene Themen behandeln und die ich empfehlen kann: Slatkin: "Effektiv Python programmieren" und Ramalho: "Fluent Python" (Englisch). Allerdings wird in beiden Büchern kein Wort über GUI-Entwicklung verloren.
Danke Dir, im Grunde komme ich ja ganz gut zurecht, habe ja auch einige andere Sprachen gelernt, so das ich nie ganz am Anfang stehe. Und die Python IDLE reicht mir auch, denn ich habe keine großen Objekte geplant. Wollte halt einen Ersten Einblick in die GUI Programmierung mit Tkinter gewinnen, und das ist mir ja gelungen.

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von thoerb » 07.07.2021 18:44:23

ralli hat geschrieben: ↑ zum Beitrag ↑
07.07.2021 08:29:18
Hallo @tobo, Du hast Dir ja ein kompetentes Wissen angeeignet und erarbeitet. Mit Recherche allein wird dieses Ziel nicht zu erreichen sein. Könntest Du mir bitte verraten, ob und welche Literatur (Fachbücher) Dir dabei geholfen haben und welches Buch Du mir empfehlen kannst? Danke.

Gruß ralli
Ich hatte mir letztes Jahr die Grundlagen von Python mit dem Buch "Einstieg in Python" von Thomas Theis angeeignet. Da sich das Buch eher an Anfänger richtet, konnte ich einiges schnell überfliegen, ein paar Kapitel habe ich auch ganz ausgelassen. In diesem Buch gibt es neben den Grundlagen der Programmierung bis hin zu OOP auch noch weitere Kapitel zu Datenbanken, Webentwicklung, Raspberry Pi, und Benutzeroberflächen mit TKinter. Ist wie gesagt ein Buch für Einsteiger und die einzelnen Kapitel gehen nicht so in die Tiefe. Aber für den Einstieg in Python fand ich es nicht schlecht, weil es auch für Nichtinformatiker leicht verständlich geschrieben ist.

Ich hatte auch erst gezögert, weil ich dachte ich könnte mir das alles über das Internet aneignen, habe dann aber den Kauf des Buches nicht bereut.

Benutzeravatar
ralli
Beiträge: 3900
Registriert: 02.03.2008 08:03:02

Re: Mit Python3 und Tkinter Text Widget mit vertikaler Scrollbar versehen

Beitrag von ralli » 07.07.2021 20:16:11

Danke @thoerb, für den Tipp, ich werde es mir genauer anschauen und gegebenfalls dann auch kaufen.

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören.

Antworten