Anfängerfragen

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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?
MfG DeKugelschieber
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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()
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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?^^)
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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()
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Ja! Vielen dank, aber klappt das auch für bottons oder können die wrap = 'word'? (kann ich gerade nicht ausprobieren).
MfG DeKugelschieber
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.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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.
MfG DeKugelschieber
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

wraplength, ja aber das kennt wahrscheinlich auch kein = 'word', kann man was (zb. Text()) in einen Button zeichnen?
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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
MfG DeKugelschieber
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

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
MfG DeKugelschieber
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

@ 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
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Zuletzt geändert von wuf am Dienstag 2. März 2010, 17:20, insgesamt 1-mal geändert.
Take it easy Mates!
Antworten