Dropdown Box mit Tkinter // Listbox Problem

Fragen zu Tkinter.
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Dropdown Box mit Tkinter // Listbox Problem

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 13:12

Hallo Leute, ich such schon seit einiger Zeit die Möglichkeit mit Tkinter eine Dropdownbox zu erstellen, in etwa so:

Bild

bin aber immer noch auf der suche :(

zur not steig ich auf wxPython um wenn:

1. sowas dort möglich ist (?)

2. ich die GUI hauptsächlich in Tkinter aufbaue und die Dropdownbox mit wxPython einfach "zwischenquetsche" kann (?)
Zuletzt geändert von sorgenlos am Montag 3. Dezember 2007, 15:42, insgesamt 1-mal geändert.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Sonntag 2. Dezember 2007, 13:21

Tix hat sowas. Ansonsten gibts die Tkinter.Listbox, allerdings müsstes du dir da selbst etwas basteln. Nr. 2 wird nicht möglichsein. Wobei, wenn man in 2 threads ein Tkinter und eine andere GUI laufen lässt, die übernanderlegt, die Fensterränder entfernt, könnte es klappen. :wink:
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 14:52

okay das mit der Listbox scheint mir zu passen :D
aber wie definier ich die position der Listbox in der gui?

http://effbot.org/tkinterbook/listbox.htm hilft mir auch nicht mehr weiter leider :/

edit: ich habs hinbekommen

[code=]listbox.place(x=30, y=600, width=80, height=50)[/code]
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 2. Dezember 2007, 16:50

Normalerweise nimmt man da einen Layout-Manager.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 17:15

Was versteht man unter Layout-Manager?

So ich hab nun ein paar Listboxes erstellt und rumexperimentiert,

aber ich bekomm es nicht hin das wenn ich 2 oder mehr Listboxen habe,

dass dann bei Auswahl in der 2. die Auswahl in der 1. Listbox bleibt,

sie verschwindet immer.


Ich hab auch schon mit selectmodes rumgespielt,

aber das scheint nichts zu nützen da diese nur innerhalb einer Listbox funktionieren.

Wie kann ich diese Problem denn lösen,

das tkinterbook gibt auch keine weiteren Informationen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 2. Dezember 2007, 17:46

sorgenlos hat geschrieben:Was versteht man unter Layout-Manager?

Guck mal hier.

Kurz zusammengefasst sind das Helfer die sich darum kümmern, dass die Widgets optimal auf dem Programmfenster plaziert sind, d.h. wenn das Fenster vergrößert wird, dass die Widgets dann immer noch an den richtigen Stellen sind.

Das ist quasi das Gegenteil von dem was Visual Basic immer geboten hat und wenn man mal darüber nachdenkt ist das auch viel angenehmer zu nutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 18:12

Das Programm an dem ich grad schreibe hat an die

40 Entry-Felder

50 Labels

und eine Hand voll Buttons

und dazu werden noch knapp 10 Listboxen hinzukommen wenn ich das

Problem mit dem Fokus nicht hätte :D


Der Quelltext sieht dementsprechend aus :lol:

ich habe alle Widgets mit dem place-Manager verwaltet,

würde es mir "Quellcodezeilen" ersparen wenn ich mit "Packer" oder "Gridder" arbeite?
BlackJack

Beitragvon BlackJack » Sonntag 2. Dezember 2007, 19:04

Eigentlich ist das erstmal egal weil der Place-Layoutmanager dafür einfach das falsche Werkzeug ist.

Quelltextzeilen sparst Du wenn Du sich wiederholende Code-Abschitte, die nur in "Daten" variieren, in Schleifen steckst.

Und falls das bis jetzt alles direkt in einem Widget steckte, solltest Du Dir überlegen es auf mehrere Container auf zu teilen, um mehr Übersicht im Quelltext und vielleicht sogar in der Anzeige zu schaffen.
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 19:18

wie teil ich denn eine gui in mehrere container? :shock:
BlackJack

Beitragvon BlackJack » Sonntag 2. Dezember 2007, 20:08

Indem nicht alle Widgets auf dem Fenster platziert werden, sondern Sachen die zusammengehören in Frames gruppiert werden, und diese dann auf dem Fenster platziert werden.

Zum Beispiel kann man je ein Label plus dazugehöriges Entry in einen Frame stecken. Oder eine Gruppe von Labels und Entries in einen Frame mit Grid-Layout, usw.
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Sonntag 2. Dezember 2007, 21:00

Wenn ich wüsste wie sowas geht, und wie die Struktur dabei aussieht dann würde ich das auch machen, kannst du mir sagen wo ich da was konkretes anchlesen kann, bzw. Hilfestellung bekommen kann?
BlackJack

Beitragvon BlackJack » Montag 3. Dezember 2007, 08:54

An Introduction to Tkinter und Thinking in Tkinter sind zwei nützliche Texte zum Thema Tkinter-Programmierung.
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Montag 3. Dezember 2007, 11:10

edit: Danke BlackJack, dass sieht sehr gut aus, da werde ich mich mal durchlesen-arbeiten!

Ich will nich für jedes meiner Probleme ein neues Thema eröffnen deswegen kommts hier rein,

hat ja auch was mit Listboxen zu tun, und zwar hab ich eine Listbox mit 2 Einträgen.

Ich kann meine Selection mit einem Button auslesen lassen und den die Selection in der Shell printen lassen.


[code=]from Tkinter import *
class test_GUI:
def __init__(self):

fenster=Tk()
fenster.geometry("110x75")

#Die Listbox
lb = Listbox(fenster, selectmode=EXTENDED)
lb.pack()
lb.place(x=18, y=10, width=80, height=35)
lb.insert(END, "Peter")
lb.insert(END, "Hans")

#Der Button
test_button=Button(fenster,text="test", command=self.read)
test_button.place(x=6, y=50, width=100, height=20)

#die Methode
def read(event):
text = lb.get(lb.curselection())
print text

__name__ == '__main__'
dasFenster = test_GUI()
mainloop()
[/code]

Vom Prinzip her ziemlich simpel bis auf den Fehler:

[code=]Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "C:\123.py", line 19, in read
text = lb.get(lb.curselection())
NameError: global name 'lb' is not defined[/code]

ich versteh nicht wieso lb nicht "defined" sein soll, dass ist doch in Zeile 8 passiert...

Vielleicht ist der Fehler zu einfach zu beheben, dass ich nicht drauf komme :?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Montag 3. Dezember 2007, 11:20

Du musst lb an die Klasse binden mit dem Schlüsselwort self...

Also statt lb lieber self.lb, weil du es ja auch außerhalb der __init__ Methode benutzen willst.
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Beitragvon sorgenlos » Montag 3. Dezember 2007, 11:27

Hab ich auch versucht, mit self.* es zu globalisieren aber der Fehler bleibt.

Kannst du es mal bei dir versuchen? Es kann ja nicht sein, dass es bei mir nicht funktioniert :x

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder