Seite 1 von 1

Tkinter und Pulldown?

Verfasst: Montag 4. Oktober 2004, 13:49
von Mawilo
Hallo,

ich möchte in einem Prog (mit Tkinter) eine Auswahl mit Pulldownmenüs einbauen. Gibt es dafür schon Module? Oder vieleicht kennt jemand gute Links zu diesem Thema?
Bin für jeden Hinweis dankbar.

Stephan

Verfasst: Montag 4. Oktober 2004, 16:40
von mawe
Hi!

Meinst Du Pulldown oder Popup? Pulldown sind doch die ganz normalen, oder? Naja, hier gibt's für beide ein Beispiel.

Gruß, mawe

Verfasst: Montag 4. Oktober 2004, 19:53
von Mawilo
Hi mawe,

ich glaube, das nennt sich Optionsmenü. :oops: Das sind die Dinger (jedenfalls in Windows) mit einem kleinen Dreieck, und wenn man da drauf klickt, bekommt man eine Auswahl angeboten. Wenn dann ein Eintrag angeklickt wurde, verschwindet die Auswahlliste wieder.

Oh man ist das peinlich :oops: :oops: :oops:

Stephan

Verfasst: Montag 4. Oktober 2004, 20:04
von mawe
Hi!

Nach Deiner Erklärung kann ich sagen, daß ich so etwas noch nie gesehen habe :D
Es gibt allerdings ein Optionmenu (jedenfalls heisst es so) bei Tkinter. Sieht aber irgendwie anders aus. Schau mal hier.
Bei den PMW ist auch so etwas dabei (habe ich gelesen).

Gruß, mawe

Verfasst: Montag 4. Oktober 2004, 20:15
von Mawilo
Hi mawe,

so schlecht kann meine Beschreibung nicht gewesen sein - das ist es was ich suche. :D Sieht zwar etwas anders aus als in Windows, aber das muss ja kein Nachteil sein.

Vielen Dank

Stephan

Verfasst: Mittwoch 6. Oktober 2004, 14:17
von Mawilo
Hi,

eine Frage habe ich doch noch.

Ich möchte nach einer Auswahl den ausgewählten Wert weiter verarbeiten.
Leider wird so erst nach dem nächsten klick auf das OptionsMenu der Wert aktualisiert.

Code: Alles auswählen

lb1 = Label(fr2,text='Reg: ')
lb1.grid(row=1,column=1,sticky=W)
var1 = StringVar()
var1.set('17')
om1 = apply(OptionMenu,(fr2,var1)+tuple(Reg))
om1.grid(row=1,column=2)
om1.bind('<Button-1>',aktualisieren_reg)
Hat jemand ne Idee, wie der Wert des Menüs schon beim ersten Klick aktualisiert wird?

Stephan

Verfasst: Mittwoch 6. Oktober 2004, 15:44
von mawe
Hi!

Meinst Du in etwa so:

Code: Alles auswählen

from Tkinter import *

root = Tk()

var1  = StringVar()
var1.set("One")

o = OptionMenu(root, var1, "One", "Two", "Three")
o.pack()

l = Label(textvariable=var1)
l.pack()

root.mainloop()
Gruß, mawe

Verfasst: Mittwoch 6. Oktober 2004, 19:43
von Mawilo
Hi mawe,

soweit ist mir das schon klar. Ich möchte, das z.B. eine print-Anweisung immer neu ausgegeben wird.

Code: Alles auswählen

from Tkinter import * 
root = Tk() 
var1  = StringVar() 
var1.set("One") 
o = OptionMenu(root, var1, "One", "Two", "Three") 
o.pack() 
l = Label(textvariable=var1) 
l.pack()
print var1.get()
root.mainloop() 
das funktioniert leider nicht, da nur beim Erstellen die Variable ausgegeben wird und nicht jedesmal bei einer neuen Eingabe über das OptionMenu

Stephan

Verfasst: Samstag 9. Oktober 2004, 21:33
von Mawilo
Hi,

ich möchte mein Problem noch einmal genauer darstellen.

Code: Alles auswählen

from Tkinter import * 

dic = {17:119,18:023,20:056,40:006}

root = Tk() 

var1  = StringVar() 
var1.set('17') 
o = OptionMenu(root, var1,'17','18','20','40') 
o.pack() 
l = Label(text=dic[int(var1.get())]) 
l.pack()

root.mainloop() 
Wie kann ich die Anzeige im Label aktualisieren, wenn im OptionMenu ein anderer Eintrag ausgewählt wird?

Stephan

Verfasst: Samstag 9. Oktober 2004, 22:17
von mawe
Hi!

Ich habe gerade herausgefunden, daß OptionMenu auch ein command besitzt (man lernt nie aus :D). Das ist wahrscheinlich was Du suchst, oder?

Code: Alles auswählen

from Tkinter import *

dic = {17:"119",18:"023",20:"056",40:"006"}

def set_it(e):
	l.configure(text=dic[int(var1.get())])

root = Tk()

var1 = StringVar()
var1.set('17')
o = OptionMenu(root, var1, '17','18','20','40',command=set_it)
o.pack()

l = Label(text=dic[int(var1.get())])
l.pack()

root.mainloop()
Gruß, mawe

Verfasst: Sonntag 10. Oktober 2004, 20:33
von Mawilo
Hi mawe,

ja, das ist es! :D :D

Danke

Stephan

Verfasst: Freitag 15. Oktober 2004, 22:25
von Mawilo
Hi,

ich muss noch einmal nerven.
Wenn ich folgenden Code allein starte, werden die Variablen richtig gesetzt und die Anzeige ist ok. Rufe ich die Klasse aus dem Hauptprogramm auf, wird am OptionMenu keine Variable angezeigt und die Variable für den Checkbutton wird auch nicht gesetzt.
Der Code ist vieleicht newbiemäßig - aber es funktioniert ansonsten ganz gut :D

Hat jemand eine Idee, wo der Fehler bei der Anzeige liegen könnte?

Stephan

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
import tkMessageBox

class addHafas:
    def __init__(self):
        self.root = Tk()
        self.root.title('Relationen zufügen')
        self.fr1 = Frame(self.root,bd=5)
        self.fr1.pack()
        self.fr2 = Frame(self.root,bd=5)
        self.fr2.pack()
        self.fr3 = Frame(self.root,bd=5)
        self.fr3.pack()
        self.fr4 = Frame(self.root,bd=5)
        self.fr4.pack()
        self.lb1 = Label(self.fr1,text='Relationen zufügen für Region:')
        self.lb1.grid(row=1,column=1)
        self.region = StringVar()
        self.region.set('17')
        self.om = apply(OptionMenu,(self.fr1,self.region)+tuple(Regionen))
        self.om.grid(row=1,column=2)
        self.var_en1 = StringVar()
        self.var_en2 = StringVar()
        self.var_ch1 = StringVar()
        self.var_ch1.set('mit')
        self.lb2 = Label(self.fr2,text='Von:')
        self.lb2.pack(side=LEFT)
        self.en1 = Entry(self.fr2,width=5)
        self.en1.pack(side=LEFT)
        self.lb3 = Label(self.fr2,text='bis:')
        self.lb3.pack(side=LEFT)
        self.en2 = Entry(self.fr2,width=5)
        self.en2.pack(side=LEFT)
        self.ch1 = Checkbutton(self.fr2,text='H&R',
                               variable=self.var_ch1,
                               onvalue = 'mit',
                               offvalue= 'ohne',
                               takefocus=0)
        self.ch1.pack()

        self.b0 = Button(self.fr4,text=' Zufügen ',command=self.druck)
        self.b0.grid(row=1,column=1)
        self.b1 = Button(self.fr4,text='Speichern',command=self.druck,takefocus=0)
        self.b1.grid(row=1,column=2)
        self.b2 = Button(self.fr4,text=' Beenden ',command=self.end,takefocus=0)
        self.b2.grid(row=1,column=3)
        self.en1.focus_set()
        self.root.mainloop()



    def druck(self):
        a = []
        try:
            if os.path.isfile('./Files/HAFAS_REG_%s.txt'%self.region.get())== False:
                f = file('./Files/HAFAS_REG_%s.txt'%self.region.get(),'w+')
            else:
                f = file('./Files/HAFAS_REG_%s.txt'%self.region.get(),'r')
        except:
            tkMessageBox.showerror('Fehler','Datei HAFAS_REG_%s.txt\
 kann nicht gelesen werden'%self.region.get())
        for line in f:
            a.append(line)
        f.close()
        a.append('%s-%s,\n'%(self.en1.get(),self.en2.get()))
        if self.var_ch1.get()== 'mit':
            a.append('%s-%s,\n'%(self.en2.get(),self.en1.get()))
        self.en1.delete('0','end')
        self.en2.delete('0','end')
        f = file('./Files/HAFAS_REG_%s.txt'%self.region.get(),'w')
        f.write(''.join(a))
        f.close()
        
    def end(self):
        self.root.destroy()
    
Regionen = '01','02','03','04','06','08','09','10',\
           '11','12','13','15','16','17','18','19',\
           '20','21','22','23','25','26','27','30',\
           '31','40','41','43','44','45','46','80'

if __name__ == '__main__':
    x = addHafas()

Verfasst: Freitag 15. Oktober 2004, 23:29
von Dookie
Hi Stephan,

was macht das Hauptprogramm? Du kannst nur ein root-Fenster aus Tk() haben! Ich würde entweder das Fenster dann als Parameter an __init__ übergeben oder von Hause aus ein eigenes Fenster mit Toplevel() erzeugen, dann kommt natürlich auch das root.mainloop() raus aus dem __init__!


Gruß

Dookie

Verfasst: Samstag 16. Oktober 2004, 09:02
von Mawilo
Hi Dookie,

ja, das war der Fehler. Mir war nicht bekannt, dass ich nur ein root-Fenster haben kann :oops:
Mit Toplevel() funktioniert alles.


Vielen Dank

Stephan

Ähnliches Problem!

Verfasst: Dienstag 24. Mai 2005, 13:13
von target
Da ich ein ähnliches Problem wie Stephan es hatte habe, schreib ich es einfach hier rein...
Ich hatte auch das Problem die Eingaben weiterzuverarbeiten! Hier der Code nun mit dem "command"-Versuch

Code: Alles auswählen

import tkMessageBox 
import sys
import os
from Tkinter import *

# Hauptfenster
root = Tk() # Fenster erstellen
Menu=Frame(root)
Menu.grid(row=0,column=0)
Inhalt=Frame(root)
Inhalt.grid(row=1,column=0)

manns = 5
mannsname = [a, b, c]
def manns_save():
    global mannsname
    auswahllist = []
    auswahlmenu = []
    auswahltext=Label(Inhalt, text="Eingabe der Spiele am Spieltag")
    auswahltext.grid(row=0, column=1)
    row = 1
    column = 1
    def set_it():
       auswahllist.append(auswahl.get())
       print auswahllist
    for i in range(manns):
         if i%2==0:
            row += 1
            column = 1
         auswahl = StringVar()
         auswahl.set("Bitte auswählen")
         auswahlmenu.append(OptionMenu(Inhalt, auswahl, *mannsname,command=set_it))
         auswahlmenu[-1].grid(row=row, column=column)
         aussehen = {"bg":"grey","font":"arial 10 bold","relief":SUNKEN, "width":15, "activebackground":"darkblue", "activeforeground":"white"}
         auswahlmenu[-1].config(aussehen)
         column = column + 2
a.) Muss ich es allerdings hinbekommen, dass der Wert vom ersten OptionMenu auch der erste Wert in der Liste ist, auch wenn der Benutzer zuerst einen anderen Wert anklickt..
b.) Zeigt er mir beim OptionMenu bei dem command-Attribut einen Syntax Fehler an?!

EDIT by mawe: Ich sag nur Python-tags

Re:

Verfasst: Freitag 17. September 2010, 15:56
von Py-Prog
mawe hat geschrieben:Hi!

Meinst Du Pulldown oder Popup? Pulldown sind doch die ganz normalen, oder? Naja, hier gibt's für beide ein Beispiel.

Gruß, mawe
Danke, hat mein Problem gelöst. :D