Hintergrundbild + Tabellarische Anordnung mehrerer Werte

Fragen zu Tkinter.
Antworten
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

Hallo!
Ich bräuchte für ein Projekt die Möglichkeit, ein Hintergrundbild in ein Tkinter-Fenster zu bekommen. Ich habe schon versucht, ein Label als "Oberwidget" zu verwenden, was allerdings nicht funktionierte (mein Button wurde anscheinend vor dem Label gepackt). Ein Frame bietet allerdings nicht die Möglichkeit, Bilder in den Hintergrund zu laden. Hat jemand eine Idee?

Außerdem bräuchte ich noch die tabellarische Anordnung von mehreren Elementen (auch in Tkinter). Das Ganze sollte in etwa so aussehen:
http://bytes.com/attachments/attachment ... rygrid.gif
Die Möglichkeit, Entrys zu benutzen fällt allerdings weg, weil ich die einzelnen Spalten skalierbar machen möchte. Hat vielleicht hier jemand eine Idee?

Ich bedanke mich schonmal im Vorraus,
Dark Shadow
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Für das Hintergrundbild würde ich einen Canvas benutzen und dann ein Bild mit der create_image()-Methode auf diesen packen.

Für die Tabelle kann man auch Entries nehmen(die können auch skalierbar gemacht werden), das geht aber nur begrenzt, bei zu großen Tabellen könnte es starke Performance-Verluste geben. Hier sollte man Tk aufrüsten, dazu gibt es tktable um die Tk-Lib zu erweitern und einmal den TkTableWrapper um die Tabelle in Tkinter verfügbar zu machen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

Der Hintergrund funktioniert! Danke!

Die Tabelle kann ich leider nicht einbinden, da ich nicht weiß, wie man tktable "installieren" muss (in welche Ordner gehören welche Dateien?). Gibt es keinen Installer dafür? Ich habe in der Readme.txt gelesen, man soll _irgendwo_ "nmake makefile.vc" eingeben. Im CMD funktioniert das allerdings nicht (Befehl "nmake" nicht bekannt). Was muss ich tun, um tktable benutzen zu können?

Danke auf jeden Fall für deine schnelle Antwort,
Dark Shadow
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Du musst die Source erst kompilieren, steht auch in der Anleitung, dafür nimmst du entweder cygwin, MinGW oder das VisualStudio 5+.
Wenn du es mit den Grundeinstellungen kompilierst ladet der Build in C:\Tcl von dort musst du es nur in deinen Python-Tcl-Ordner kopieren und das Paket dann nur noch in der "pkgIndex.tcl"-Datei eintragen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

Danke!
Ich habe jetzt aber auch eine andere Möglichkeit gefunden (für Python 2.6.2):

http://blog.clintecker.com/post/1484533 ... and-python

Die Dateien sind bei tktable 2.7 in der "Tktable2.7-win32-x86.zip"-Datei. Dann einfach der obigen Anleitungen folgen. Tktable sollte funktionsbereit sein.

Danke für Deine schnelle Hilfe, Xynon1.
Dark Shadow
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

Ich entschuldige mich für den Doppelpost, aber für diese Frage braucht man mMn keinen neuen Thread aufmachen:

Wie kann man Werte in die tktable.Table()-Tablle einfügen? insert funktioniert nicht, auch nicht set oder Ähnliches. Die Variante aus TkTableWrapper.py (variable=var) funktioniert seltsamerweise auch nicht. Die Variable existiert und ihre Namen sind unter tvar.names() "verfügbar". Gibt es vielleicht eine andere Möglichkeit, Werte in eine bestimmte Zelle einzufügen?

Danke,
Dark Shadow
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ja, kann man ändern, einfach das ArrayVar berabeiten. Dieses stellt eine set-Methode und eine Index-Möglichkeit die Werte zu ändern. Musste auch ebend erstmal Nachsehen, die Index-Methode ist schon merkürdig, aber die set-Methode haut ein aus den Socken.

Die Syntax ist:

Code: Alles auswählen

array_var.set(**{"x,y" : value})
, wenn du es also so nutzen willst wie es der Wrapper momentan vorgibt, dann nimm besser die Index-Methode(welche die set-Methode aufruft):

Code: Alles auswählen

array_var['x,y'] = value
Ansonsten würde ich dir raten die stelle so umzuschreiben

Code: Alles auswählen

def set(self, (x, y), value):
    var._tk.call('array', 'set', str(var), ("{0},{1}".format(x, y), value))

def __setitem__(self, key, value):
    self.set(key, value)
dann kannst du es so nutzen:

Code: Alles auswählen

array[(x, y)] = value
Edit: Noch eine Anmerkung, das Wörterbuch ist implementiert um mehrere Positionen gleichzeitig zu setzen, um eine hohe Anzahl von Tk-Rufe zu vermeiden, also dann doch besser so belassen wie es ist, außer vieleicht die String-Formation.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten