Tkinter und Pulldown?

Fragen zu Tkinter.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Tkinter und Pulldown?

Beitragvon Mawilo » Montag 4. Oktober 2004, 13:49

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Montag 4. Oktober 2004, 16:40

Hi!

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

Gruß, mawe
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Montag 4. Oktober 2004, 19:53

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Montag 4. Oktober 2004, 20:04

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Montag 4. Oktober 2004, 20:15

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Mittwoch 6. Oktober 2004, 14:17

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 6. Oktober 2004, 15:44

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Mittwoch 6. Oktober 2004, 19:43

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Samstag 9. Oktober 2004, 21:33

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Samstag 9. Oktober 2004, 22:17

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Sonntag 10. Oktober 2004, 20:33

Hi mawe,

ja, das ist es! :D :D

Danke

Stephan
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Freitag 15. Oktober 2004, 22:25

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()
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 15. Oktober 2004, 23:29

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Samstag 16. Oktober 2004, 09:02

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
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Ähnliches Problem!

Beitragvon target » Dienstag 24. Mai 2005, 13:13

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder