Entry justify für lange strings

Fragen zu Tkinter.
Antworten
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Hallo,

wie kann ich in einem Entry den String rechtsbündig ausgeben wenn der String länger ist als das Entry?

Ich habe zwei Entries welche jeweils einen Pfad enthalten und damit schnell länger werden als das Entry.
Da mich bei den Pfaden nur die letzten ein- zwei directories unterschiedlich sind, hätte ich gerne diese
auch im Display.
Ich habe justify=RIGHT gesetzt, und wenn der Pfad kurz ist und ins Entry passt wird er auch rechtsbündig
angezeigt. Wird der Pfad jedoch länger als das Entry, ist er grundsätzlich linksbündig,
sprich [c:\bla\bla]h\fasel statt c:\bla\[blah\fasel] - die Eckigen Klammern symbolisieren den Darstellungsbereich des Entry's
"In jedem kleinen Problem steckt ein großes das gerne raus will"
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@thaloss
Ich würde dafür die `Tkinter.Entry.icursor()` und `Tkinter.Entry.xview()` Methoden nutzen:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
entry = tk.Entry(root, width=15)

entry.insert(0, r'c:\this\is\a\very\long\path\to\any\location')
entry.icursor(tk.END)
entry.pack()
entry.xview(tk.END)
entry.focus()
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

@mutetella

Danke, dein Programm funktioniert, aber in meinem nicht, liegt wahrscheinlich daran das ich ein ttk Entry mit Textvariable verwende

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import simpledialog
import os
import os.path as Path
import configparser
#[...]
file_dir_var = tk.StringVar()
#[...]
file_dir_var.set(file_dir)            # file_dir wurde per configparser aus ini file gelesen
#[...]
file_btn = ttk.Button(locset, text='directory', command=LOC_filedir, width=16)
file_btn.grid(column=0, row=0, padx=10, pady=3)
file_ent = ttk.Entry(locset, textvariable=loc_file_dir_var, state="readonly", justify='right')
file_ent.grid(column=1, row=0, padx=2, pady=3, sticky='ew')
file_ent.icursor(tk.END)
file_ent.xview(tk.END)
#[...]
def LOC_filedir():
    global file_dir
    try:                        #   try to open the directory
        ld = Path.normpath(filedialog.askdirectory())
        if (ld != '') and Path.isdir(ld) :
            file_dir = ld
            file_ent.configure(foreground='blue')
            cnf_ver.set('Config unsaved')
        else :                  #   invalid Path
            file_dir = 'Not a directory'
    except PermissionError:     #   No permissin on directory
        file_dir = 'No permission'
    file_dir_var.set(file_dir)
    return file_dir
file_dir hält den Pfad für die interne Benutzung und wird entweder aus dem ini file gelesen oder per filedialog selektiert.
Ich habe die icursor und xview anweisungen beim definieren des Entry's angegeben. Siehe oben, hat aber keinen Effekt.

Achso ich bin mit python 3.4 unterwegs.
"In jedem kleinen Problem steckt ein großes das gerne raus will"
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@thaloss
Keine Ahnung weshalb, aber `ttk.Entry.xview()` akzeptiert im Gegensatz zum `tk` Pendant kein `tk.END` als Argument. Wenn Du stattdessen die Länge des Pfadstrings verwendest, sollte es klappen:

Code: Alles auswählen

Python 3.3.4 (default, Feb  9 2014, 12:04:33) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter as tk
>>> from tkinter import ttk
>>> root = tk.Tk()
>>> entry = ttk.Entry(root, width=15, justify=tk.RIGHT)
>>> path = r'c:\this\is\a\very\long\path\to\any\location'
>>> entry.insert(0, path)
>>> entry.icursor(tk.END)
>>> entry.pack()
>>> entry.xview(len(path))
>>> entry.focus()
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

@mutetella

Yepp, Danke funktioniert mit dem len(path). Es reicht sogar nur der die Zeile
file_ent.xview(len(loc_file_dir))
hinter dem setzen der Textvariable um das Pfadende darzustellen.

Danke nochmals
"In jedem kleinen Problem steckt ein großes das gerne raus will"
Antworten