Seite 2 von 4

Verfasst: Montag 1. März 2010, 19:00
von wuf
Hallo DeKugelschieber
DeKugelschieber hat geschrieben:2. Es muss doch möglich sein automatische Zeilenumbrüche in einem Label zu machen, und wenn nicht (was eigentlich total bescheuert ist), was für alternativen gibt es (kein Text()!)?
Schon einmal etwas mit der Label-Option 'wraplength' (in Pixel) herumgespielt? Oder mit dem hinzufügen (beim Text-String) von '\n'?

Gruss wuf :wink:

Verfasst: Montag 1. März 2010, 19:20
von DeKugelschieber
was soll ein \n bei einer variablen breite bringen? ich versuchs dann mal mit wraplength.

achja, kann man diesen hässlichen ersten menüeintrag (der der noch ein fenster öffnet) löschen?

Verfasst: Montag 1. März 2010, 19:24
von numerix
DeKugelschieber hat geschrieben:2. Es muss doch möglich sein automatische Zeilenumbrüche in einem Label zu machen, und wenn nicht (was eigentlich total bescheuert ist), was für alternativen gibt es (kein Text()!)?
Gibt es irgendeinen speziellen Grund, warum es kein Text-Widget sein soll? Damit kannst du doch genau das erreichen, was du möchtest.

Verfasst: Montag 1. März 2010, 20:05
von DeKugelschieber
vielleicht hab ich das falsch verstanden, aber ein text widget erzeugt doch ein eingabefeld (textarea)? Zumindest kommt sowas dabei raus:

Code: Alles auswählen

from tkinter import *

t = Tk()
tx = Text(t)
tx.pack()
t.mainloop()

Verfasst: Montag 1. März 2010, 20:18
von wuf
DeKugelschieber hat geschrieben:Was mir gerade noch so einfällt, kann man ein kleines icon in eine liste vor einen string setzen?
Verstehe nicht so genau was du machen möchtest hier etwas zum ausprobieren.

Code: Alles auswählen

import Tkinter as tk

app_win = tk.Tk()

two_dim_list = [['icon_name_1.gif', 'my_text_string_1'],
                ['icon_name_2.gif', 'my_text_string_2']
                ]

icon_obj = None

for icon_name, text in two_dim_list:
    label = tk.Label(app_win,)
    label.pack()
    label.icon_obj = tk.PhotoImage(file=icon_name)
    label.config(image=label.icon_obj, text=text, compound='left', padx=5)

app_win.mainloop()
Gruss wuf :wink:

Verfasst: Montag 1. März 2010, 20:22
von DeKugelschieber
nein so nicht^^ ich meine das man ein kleines icon vor jeden auswahlpunkt in eine listbox setzt, damit ich z.b. anzeigen kann ob die antwort richtig oder falsch beantwortet wurde... es würde mir auch erstmal reichen wenn man die hintergrundfarbe eines einzellnen inserts ändern kann (bin ich eigentlich zu anspruchsvoll für tkinter?^^)

Verfasst: Montag 1. März 2010, 20:33
von wuf
DeKugelschieber hat geschrieben:(bin ich eigentlich zu anspruchsvoll für tkinter?^^)
Könnte gut sein! Tkinter ist kein 'drag and drop' Spieltruhe.

Gruss wuf :wink:

Verfasst: Montag 1. März 2010, 20:59
von numerix
DeKugelschieber hat geschrieben:vielleicht hab ich das falsch verstanden, aber ein text widget erzeugt doch ein eingabefeld (textarea)? Zumindest kommt sowas dabei raus:
Sicher, wenn du die Basis-Variante verwendest. Du kannst aber ein Text-Widget so konfigurieren, dass es optisch von einem Label nicht unterscheidbar ist - allerdings den von dir gewünschten automatischen Zeilenumbruch beeinhaltet:

Code: Alles auswählen

import tkinter as tk

root = tk.Tk()
lb = tk.Label(root,text="Ein echtes Label ohne Zeilenumbruch etc." )
txt = tk.Text(root,relief="flat",wrap="word",highlightthickness=0,font=lb.cget("font"))
txt.insert("0.0","Das ist ein Pseudo-Label. Sieht aus wie ein echtes Label \
ist aber gar keins! Lässt sich auch prima zusammenschieben und produziert \
dabei automatische Zeilenumbrüche.")
txt.config(state="disabled")
lb.pack(pady=10,padx=10)
txt.pack(fill=tk.X,padx=10)
root.mainloop()

Verfasst: Dienstag 2. März 2010, 08:39
von DeKugelschieber
Ja! Vielen dank, aber klappt das auch für bottons oder können die wrap = 'word'? (kann ich gerade nicht ausprobieren).

Verfasst: Dienstag 2. März 2010, 08:48
von BlackJack
@DeKugelschieber: Du schreibst bei Java ``(int) b`` wenn `b` vom Typ `java.lang.String` ist!? Dann verwendest Du ein anderes Java als ich. ;-)

Zu Variablen und Methoden dürfen nicht den gleichen Namen haben: In Python gibt es keinen Unterschied zwischen diesen beiden. Alles was man an einen Namen binden kann, ist in Python ein Objekt. Inklusive Klassen, Funktionen, und Methoden.

Verfasst: Dienstag 2. März 2010, 08:58
von DeKugelschieber
Gut das ich das jetzt weiß :) Die dümmsten Fehler sind die die man macht weil man keine Ahnung hat^^. Und ja ich benutze wahrscheinlich eine andere Java Version.

Verfasst: Dienstag 2. März 2010, 10:27
von numerix
DeKugelschieber hat geschrieben:Ja! Vielen dank, aber klappt das auch für bottons oder können die wrap = 'word'? (kann ich gerade nicht ausprobieren).
Das musst du nicht ausprobieren, das kannst du nachlesen: http://www.effbot.org/tkinterbook/tkint ... -reference

Verfasst: Dienstag 2. März 2010, 13:32
von DeKugelschieber
wraplength, ja aber das kennt wahrscheinlich auch kein = 'word', kann man was (zb. Text()) in einen Button zeichnen?

Verfasst: Dienstag 2. März 2010, 13:46
von wuf
DeKugelschieber hat geschrieben:kann man was (zb. Text()) in einen Button zeichnen?
Du meinst schreiben oder? Kann man natürlich. Was meinst du eigentlich mit Text()? Bei einem Button ist das die Option-text.
z.B. text = 'dein Text'
Hast du 'wraplength' jetzt einmal ausprobiert? Was ist das Resultat?

Gruss wuf :wink:

Verfasst: Dienstag 2. März 2010, 14:46
von DeKugelschieber
Ja hab ich ausprobiert, aber das geht natürlich nur mit fester Breite, mit in den button zeichnen mein ich das ich ein Text() objekt erzeuge und in den button packe

Verfasst: Dienstag 2. März 2010, 16:01
von numerix
DeKugelschieber hat geschrieben:mit in den button zeichnen mein ich das ich ein Text() objekt erzeuge und in den button packe
Nein, ein Button ist kein Container. Du kannst aber ein Text-Widget so zurechtbasteln, dass es aussieht wie ein Button und auf Button-Klicks reagiert, wenn gewünscht auch mit automatischem Zeilenumbruch. Für den Anwender sieht es dann aus und verhält sich wie ein Button, in Wahrheit ist es jedoch ein Text-Widget.

Verfasst: Dienstag 2. März 2010, 16:25
von wuf
DeKugelschieber hat geschrieben:Ja hab ich ausprobiert, aber das geht natürlich nur mit fester Breite
Kannst du das folgende ausprobieren?:

Code: Alles auswählen

import Tkinter as tk

LABEL_TEXT = "The quick brown fox jumps over the lazy dog !!!"

def label_configure(event):
    label.config(wraplength=label_frame.winfo_width())

app_win = tk.Tk()

label_frame = tk.Frame(app_win)
label_frame.pack(fill='x', expand='yes')

label = tk.Label(label_frame, text=LABEL_TEXT)
label.pack()
label_frame.bind('<Configure>', label_configure)

app_win.mainloop()
Was ist deine Feststellung?

(getestet unter SuSE11.0)

Gruss wuf :wink:

Verfasst: Dienstag 2. März 2010, 16:31
von DeKugelschieber
Sicher, wenn du die Basis-Variante verwendest. Du kannst aber ein Text-Widget so konfigurieren, dass es optisch von einem Label nicht unterscheidbar ist - allerdings den von dir gewünschten automatischen Zeilenumbruch beeinhaltet:

Code: (Python)
1
2
3
4
5
6
7
8
9
10
11
12

import tkinter as tk

root = tk.Tk()
lb = tk.Label(root,text="Ein echtes Label ohne Zeilenumbruch etc." )
txt = tk.Text(root,relief="flat",wrap="word",highlightthickness=0,font=lb.cget("font"))
txt.insert("0.0","Das ist ein Pseudo-Label. Sieht aus wie ein echtes Label \
ist aber gar keins! Lässt sich auch prima zusammenschieben und produziert \
dabei automatische Zeilenumbrüche.")
txt.config(state="disabled")
lb.pack(pady=10,padx=10)
txt.pack(fill=tk.X,padx=10)
root.mainloop()
Ok das funktioniert, aber wie kann ich einstellen das das textfeld nur so hoch ist wie es sein muss, also die zeilen? height = 1 zb. zeigt (natürlich) wenn nötig keine zwei zeilen mehr an, wenn ich es weglasse ist das teil unglaublich hoch

Verfasst: Dienstag 2. März 2010, 16:34
von DeKugelschieber
@ wuf danke! genau so wollte ich das haben, ich hab mich schon gewundert das man dazu so schnell nichts findet (ist ja wohl irgendwie standard). Ich überarbeite jetzt meinen code und geb ihn euch

Verfasst: Dienstag 2. März 2010, 16:51
von wuf
Hallo DeKugelschieber

Folgendes:

Bei Qt werden dir die Widgets auf dem Goldtablett serviert

Bei wxWindows werden sie auf einem Silbertablett serviert

Bei Tkinter musst du in der Gerümpelkammer nach Objekten suchen und dann mit Schneidbrenner, Schweissapparat, Werkzeug und einer Portion Imagination dein gewünschtes Kunstwerk (Widget) zusammenbauen. Gilt hauptsächlich für Spezialwünsche.

Last but not least: Python ist die perfekte Schweisselektrode die du beim Zusammenbau verwenden musst!

Grüsschen von wuf :wink: