verstehe Fehler zu TList nicht

Fragen zu Tkinter.
Antworten
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Donnerstag 9. März 2006, 13:21

Das habe ich (in Anlehnung an die TK Listbox )versucht:

Code: Alles auswählen

import Tix

root = Tix.Tk()

Tix.TList(root)
Tix.TList.insert(0, 'Spalte1.Spalte2')
Tix.TList.pack()

mainloop()

Code: Alles auswählen

>python -u tlist-001.py
Traceback (most recent call last):
  File "tlist-001.py", line 6, in ?
    Tix.TList.insert(0, 'Spalte1.Spalte2')
TypeError: unbound method insert() must be called with TList instance as first argument (got int instance instead)
Ich weiß, dass insert() anstelle meiner 0 (für die 1.Zeile) etwas anderes erwartet.

Leider reichen meine Programmierkentnisse nicht aus, um den Fehler zu verstehen.
Ich finde nirgendwo ein Beispiel zu TList für Python (benutzt das etwa niemand?)
Die Doku bezieht sich leider auf tcl.
Habe auch versucht aus python2.3/lib-tk/Tix.py Informationen zu bekommen, aber das ist definitiv zu hoch für mich.

cu Sebastian
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Donnerstag 9. März 2006, 13:28

Code: Alles auswählen

import Tix

root = Tix.Tk()

Liste = Tix.TList(root)
Liste.insert(0, 'Spalte1.Spalte2')
Liste.pack()

root.mainloop()
äh, nimm diese schlange von meinem hals.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Donnerstag 9. März 2006, 13:44

Danke für deine Mühe und die schnelle Reaktion.

Leider wars das nicht, es kommt nun folgender Fehler:

Code: Alles auswählen

>python -u tlist-001.py
Traceback (most recent call last):
  File "tlist-001.py", line 6, in ?
    Liste.insert(Liste, 'Spalte1.Spalte2')
  File "/usr/lib/python2.3/lib-tk/Tix.py", line 1449, in insert
    self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
  File "/usr/lib/python2.3/lib-tk/Tkinter.py", line 995, in _options
    for k, v in cnf.items():
AttributeError: 'str' object has no attribute 'items'

Ich habe mal aus python2.3/lib-tk/Tix.py die entsprechenden Stellen rausgesucht vielleicht fällt ja jemanden was auf.

Code: Alles auswählen

class TList(TixWidget):
    """TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - None"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
    # gekuerzt

    def insert(self, index, cnf={}, **kw):
        self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))

Code: Alles auswählen

    def _options(self, cnf, kw ):
        if kw and cnf:
            cnf = _cnfmerge((cnf, kw))
        elif kw:
            cnf = kw
        opts = ()
        for k, v in cnf.items():
            opts = opts + ('-'+k, v)
        return opts
jochim
User
Beiträge: 32
Registriert: Montag 5. August 2002, 20:47
Wohnort: Dortmund

Donnerstag 9. März 2006, 16:49

weil das Widget auch andere Formate als Text wiedergeben kann muss das Format mit angegeben werden. Hier das Beispiel etwas modifiziert:

Code: Alles auswählen

import Tix
from Tkconstants import * #wichtig - hier ist'END' usw definiert

root = Tix.Tk()

Liste = Tix.TList(root)
Liste.insert(0, text='Spalte1')
Liste.insert(0, text='Spalte2')
Liste.insert(END, text='END')
Liste.pack()

root.mainloop()
Gruß
Jochim
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Donnerstag 9. März 2006, 17:04

Danke soweit,
werde es nacher zu Hause ausprobieren.

Ich dachte von Tix aus wird schon alles benötigte von tk importiert.
Finde ich aber doof, wenn man das manuell machen muss.
Oder gibt es da einen tieferen Sinn, den ich nicht sehe?
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Freitag 10. März 2006, 00:04

Wenn ich anstelle von Tlist ScrolledTList benutze gibt es auf einmal eine Fehlermeldung zu insert.

Code: Alles auswählen

import Tix
from Tkconstants import * #wichtig - hier ist'END' usw definiert

root = Tix.Tk()
Liste = Tix.ScrolledTList(root)
for i in xrange(20):
   Liste.insert(0, text=('%d' %i, 'Spalte1', 'Spalte1', 'Spalte1'))

Liste.pack()

root.mainloop()

Code: Alles auswählen

  File "tlist-001.py", line 7, in ?
    Liste.insert(0, text=('%d' %i, 'Spalte1', 'Spalte1', 'Spalte1'))
  File "/usr/lib/python2.3/lib-tk/Tix.py", line 326, in __getattr__
    raise AttributeError, name
AttributeError: insert
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Samstag 25. März 2006, 15:51

ok, zugegeben, tix stinkt manchmal ein bisschen :?

aber ich habe in all meiner geni(t)alität ( 8) ) eben herausgefunden, dass ja
alle widgets aus Tix aus mehreren Tk-widgets bestehen und diese lustigen
"Dummies", die dort in der im wahrsten sinne des wortes kurzen klasse
aufgerufen wurden repräsentieren diese einzelnen teil-widgets

(hab ich anhand des notebook-beispiels aus der beschreibung+tut herausgefunden...)

dabei wird dann sowas wie hier gemacht:

Code: Alles auswählen

# man möchte die variable "hallo" haben, sie liegt jedoch nur als string vor...
locals()["hallo"]="welt"
print hallo # ergibt "welt"
die strings, die in den dummies aufgerufen werden, werden also zu "echten" objekten (oder sowas ähnliches) von der "OBER"-klasse
'ScrolledTList'

also:

Code: Alles auswählen

from Tix import *
root=Tk()
stl=ScrolledTList(root)
stl.tlist.insert(0,{"text": "welt"}) # hier geht es glaub ich auch nur mit text="welt"
stl.pack()
root.mainloop()
du siest: stl.TLIST.insert, da somit die libo angesprochen wurde

3. Fehlermeldung: er kannte das durch einen string angegebene "Unter"-Objekt nicht... es war nicht in dem dictionary "self.subwidget_list"
(blöder programmierer - der dazugehörige Error heißt doch KeyError :D )
2. Fehlermeldung: du hattest einfach bei .insert(0, ...) einen string geschrieben, statt dem dictionary
(wenn jemand lange weile hat, kann er es ja mal umproggen... :wink: )
- tix will in dem moment eine fkt namens items aufrufen, wobei das ja eigentlich nur mit dictionarys geht :

Code: Alles auswählen

for i in {1:2,3:4}.items(): print i
oder so ähnlich... :lol:
1. Fehlermeldung: naja gut, das hat sich ja erklärt, obwohl ich auch nicht weiß, wie er da grad ein int bekommen soll und ich hab grad wenig zeit es auszuprobieren... *sorry*

ich hoffe, ich konnt helfen!!
(und dabei kann man sagen, dass ich mich gerade zum fast ersten mal mit Tix beschäftigt hab *stolz-auf-mich-sei*)

ansonsten:
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Montag 27. März 2006, 23:16

Danke, dass du dir so viel Mühe gibst.

Ich finde es schade, dass tix scheinbar unsaubere Python Bindings und keinerlei Python Doku hat. Besonders ärgert es mich, weil Tix einige interessante Widgets bereithält, die Tkinter definitiv aufwerten und eben einfach bei Python dabei ist.

Leider verstehe ich deine Erklärungen (trotz mehrmaligen lesens) nicht.
Kurz, ich weiß immer noch nicht, was ich falsch gemacht habe.

cu Sebastian
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Montag 27. März 2006, 23:22

dieser (der-hier) beitrag wird morgen früh 7:30 editiert mit einer versuchsweise vollständigen, leichten erklärung, denn jetzt ist erstma schicht im schacht
(morgen 4:30Uhr raus und ne arbeit geschrieben.. *löl* 8) )
bis morgen!
//edit:
ok, nochmal, als erstes mal die frage:
hats denn geklappt?(das beispiel)

der erste fehler, den du gemacht hast, lag - glaub ich nur daran, dass du die Klassen instanzen nicht gespeichert hast... - da bin ich mir aber wirklich nicht genau sicher
ansich dürfte das grundkonzept von r2d2 stimmen...
das GRUNDPRINZIP!!
in tix wurden einfach neue widgets geschrieben, indem man zb. ein frame erzeugt hat, und dort alle für das neue widget benötigten "teilwidgets" reingehauen hat

Code: Alles auswählen

from Tkinter import *
class New_Widget(Frame):
    def __init__(self, master=None, **opts):
        Frame.__init__(master, opts)
        self.g=Button(self, text="knopf")
        self.g.pack()
        self.l=Label(self, text="label")
        self.l.pack()
root=Tk()
a=New_Widget(root)
a.pack()
root.mainloop()
so, beim dritten posting - der fehler wird nun etwas komplizierter:
ich habe oben mit absicht immer "self." vor die widget-namen geschrieben, damit es jetzt einfacher wird :D

g ist also ein objekt von a...
also: a.g
genauso, glaub ich, funktioniert es auch mit den Tix-widgets:
Oberwidget.Unterwidget.Funktion_von_Unterwidget()

also solltest du nicht
Mr_Snede hat geschrieben:

Code: Alles auswählen

import Tix
from Tkconstants import * #wichtig - hier ist'END' usw definiert

root = Tix.Tk()
Liste = Tix.ScrolledTList(root)
for i in xrange(20):
   Liste.insert(0, text=('%d' %i, 'Spalte1', 'Spalte1', 'Spalte1'))

Liste.pack()

root.mainloop()
schreiben, sondern
das eines der unterwidgets von "Liste" ansprechen!!
in meinem codebeispiel siehst du, dass ich das ganze ja mit dem widget
"ScrolledTList" gemacht habe...
ich habe auch die Tix gerade nicht auf dem Pc, um nachgucken zu können, ob TList irgendwelche "Teilwidgets" besitzt/anspricht (*sorry*)
//ab hier beginnt leider kurzform:
ScrolledTList besitzt unter anderem ein objekt namens "tlist"

dies entspricht dem Textbereich für die ScrolledTList!

also nur für dieses objekt die insert - option aufrufen:

Code: Alles auswählen

from Tix import *
root=Tk()
stl=ScrolledTList(root)
stl.tlist.insert(...) # WICHTIG: stl.TLIST.insert...
stl.pack()
root.mainloop()
was das erste argument von der insert-funktion darstellt, weiß ich gerade nicht, aber wahrscheinlich ist es der index...
das zweite argument muss ein dictionary ("{'text':'hallo, alle'}") sein, da von diesem dann zu dem key 'text' der wert gesucht wird, der dann prompt eingetragen wird.. *klar*


beim 3.post hattest du einen string statt dem dict angegeben...
da aber nur ein dict die methode ".items()" hat, konnte er die von dem string ja auch nicht finden!
(die 2.fehlermeldung)

wenn ich mich nun nicht irre, habe ich alle drei fehlermeldungen versucht zu analysieren, nimm also bitte, bitte erst mal das codestückchen von mir und probiere es einfach aus und veränder immer kleine stückchen, wenn dir auch DIESER post nix geholfen hat... :roll:
übrigens war der codeausschnitt mit dem 'locals()["hello"]="world" '
nur dazu gedacht, dass du weißt, was der befehl "_dummy..." in der Tix.py bei class ScrolledTList macht... erzeugt aus einem string ein handfestes objekt/variable - sollte es dich irgendwie verwirren, vergiss es einfach oder schreib mir ne mail oder über die private nachricht oder sonst irgendwas :wink:

ich hoffe echt, dass ich dir helfen konnte, oder dir noch helfen kann
(können ja ne komplette, ausführliche doku darüber starten)
wenn ich jetzt was vergessen oder doppelt hab: *sorry*
aber eins muss ich noch loswerden:

@joachim:
nimms nicht persönlich, aber tkconstants oder so hat NICHTS mit dem format (was auch immer du damit meinst) zu tun sondern sorgt nur dafür, dass du statt der _0_ bei .insert(...) oder statt "end" auch END schreiben kannst... dadurch, dass Tix sich Tkinter importiert, läd es gleichzeitig dieses Modul mit... :wink:
nimms mir wirklich nicht übel! :D
Zuletzt geändert von Hannes-Spz am Dienstag 28. März 2006, 14:31, insgesamt 2-mal geändert.
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Dienstag 28. März 2006, 00:32

Bitte mach dir keinen Stress.
Ich habe morgen zB selbst keine Zeit für Python.

Ausserdem stehe ich mit meinem aktuellen Projekt kurz vor einem Release.
Ganz aktuell bastel ich dafür an einem Grafen auf einem Canvas Feld herum.
Bin mir nicht sicher, ob ich es bis zum Wochenende schaffe, sitze aber auf heißen Kohlen.

Für dieses Release benutze ich als Tabelle fürs Erste: http://www.python-forum.de/viewtopic.php?p=32861#32861

Aber wenn du dir die Zeit nehmen würdest nochmal eine Erläuterung zu verfassen, wäre ich dir sehr dankbar.
Musst dich eben nur nicht beeilen.

Wünsche viel Erfolg mit deiner Arbeit.

cu Sebastian
Antworten