Seite 1 von 1

Entry justify für lange strings

Verfasst: Sonntag 4. Mai 2014, 09:12
von thaloss
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

Re: Entry justify für lange strings

Verfasst: Sonntag 4. Mai 2014, 15:21
von mutetella
@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

Re: Entry justify für lange strings

Verfasst: Sonntag 4. Mai 2014, 17:20
von thaloss
@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.

Re: Entry justify für lange strings

Verfasst: Montag 5. Mai 2014, 09:18
von mutetella
@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

Re: Entry justify für lange strings

Verfasst: Montag 5. Mai 2014, 21:21
von thaloss
@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