Button menu

Fragen zu Tkinter.
Antworten
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Hallo ich suche in Tkinter
eine art button menu. Es soll ein button sein der nur aus einem pfeil nach unten besteht , bei dem wenn man draufklickt sich das menu oeffnet. Gibt es sowas ? Ich kann leider nirgends was finden. Ich bin sehr dankbar fuer jede Hilfe!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Was für ein Menü soll sich denn öffnen? Ein Toplevel- oder ein Popup-Menü? Beim Popup-Menü ist dies ja relativ einfach:
Du erstellst Dir einen beliebigen Button, der ja auch nur aus einem Pfeil bestehen kann, und bindest daran eine Routine, die das Popup-Menü mit der Menü-Methode .post(x, y) an der Position (x, y) darstellt.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

danke das mit dem popup menu funktioniert bereits aber ich hatte gern sowas wie bei menus einfach also ist das evtl. ein toplevel menu?
ich habe leider nirgends code bezueglich eines toplevel menus gefunden...

das bloede ist dass beim button menu sich das menu je nach mausposition oeffnet. ich wills aber fest verankert haben....geht das?

danke fuer Hilfe...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Du kannst ja .post beliebige, also auch fixe Koordinaten übergeben, so dass das Menü immer an derselben Position geöffnet wird.
Eine gute Einführung zu Tkinter findet sich in http://www.pythonware.com/library/tkinter/introduction/. Hier wird auch das Menu-Widget beschrieben mit Beispielen u.a. für ein Toplevel-Window
Zuletzt geändert von HWK am Montag 17. Juli 2006, 21:39, insgesamt 1-mal geändert.
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

nen kumpel von mir hat das problem mehr oder weniger aus ZUFALL anders gelöst:

er hat ein menü aus buttons vorgeschrieben und das frame, in dem sie lagen immer wieder neu packen oder gridden lassen...
mit widget.pack_forget() oder .grid_forget() oder .place_forget()
geht das ganze dann wieder weg, sodass man wieder neu packen lassen kann ;)
und wenn du ja place nimmst, stellt es das frame einfach über alle an dieser stelle vorhandenen widgets drüber, sodass es dann wirklich wie eine art menü aussieht....

vl. nur als anregung :)
lg hannes
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
villeicht meinst du sowas hier!

Code: Alles auswählen

#!/usr/bin/python
from Tkinter import *
class Fenster_Toplevel:
    def __init__(self):
        self.fenster=Tk()
        self.fenster.geometry('200x200+250+250')
        self.button=Button(self.fenster,
                       text='Toplevel',
                       command=self.top
                           )
        self.button.pack(side=LEFT)
        self.button2=Button(self.fenster,
                             text='close',
                            command=self.closeFenster
                            )
        self.button2.pack(side=LEFT)
        self.fenster.mainloop()

    def closeFenster(self):
        self.fenster.destroy()
        
    def top(self):
        self.toplevel=Toplevel(self.fenster)
        self.toplevel.geometry('200x200+290+350')
        self.lbl=Label(self.toplevel, text='Toplevel! ')
        self.lbl.pack()
        self.but=Button(self.toplevel, text='close', command=self.close)
        self.but.pack()
        self.toplevel.grab_set()
        self.toplevel.focus_set()

    def close(self):
        self.toplevel.destroy()

Fenster_Toplevel()
Gruss
pyStyler

edit: oh sorry das hast warscheinlich nicht gemeint ! Habe in deinem Post was falsch verstanden gehabt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

ein versuch noch.

Code: Alles auswählen

from Tkinter import *

class Main(object):
    def __init__(self):
        self.fenster=Tk()
        self.fenster.geometry('600x400+105+255')
        self.menuBar = Frame(self.fenster, relief = FLAT, bd=2)
        self.menuBar.pack(side=TOP, fill= X , pady=10)
        
        self.scrollbar=Scrollbar(self.fenster)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        self.text=Text(self.fenster, bg='white',
                      width=90, height=30,
                      yscrollcommand=(self.scrollbar, 'set'
                    )
                )
        self.text.pack( side=LEFT, fill=BOTH, expand=YES )
        self.scrollbar.config(command=self.text.yview)                        
        self.fileMenu() 

        self.fenster.mainloop()

    def fileMenu(self):
        mButton=Menubutton(self.menuBar, text='File',
                           relief=GROOVE,
                           width=8, height=2
                        )
        mButton.pack(side=LEFT)
        menu=Menu(mButton, tearoff=0 )
        menu.add_command(label='close', command=self.close)

        mButton.configure(menu=menu)
        return mButton

    def close(self):
        self.fenster.destroy()
   
                        
m=Main()
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

vielen lieben dank! Das letzte war genau das was ich gesucht habe!!!
Danke euch!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dasselbe geht auch mit einem Popup-Menü:

Code: Alles auswählen

from ScrolledText import ScrolledText
from Tkinter import *

class Main(object):
    def __init__(self):
        self.fenster=Tk()
        self.fenster.geometry('600x400+105+255')
        self.menuBar = Frame(self.fenster, relief = FLAT, bd=2)
        self.menuBar.pack(side=TOP, fill=X , pady=10)

        self.mButton=Button(self.menuBar, text='File', relief=GROOVE, 
                           width=8, height=2, command=self.popup)
        self.mButton.pack(side=LEFT) 

        self.menu=Menu(self.fenster, tearoff=0)
        self.menu.add_command(label='close', command=self.close) 

        self.text=ScrolledText(self.fenster, bg='white', width=90, height=30)
        self.text.pack(side=LEFT, fill=BOTH, expand=YES)

        self.fenster.mainloop()

    def popup(self):
        self.menu.post(self.mButton.winfo_rootx(),
                       self.mButton.winfo_rooty()+self.mButton.winfo_height())

    def close(self):
        self.fenster.destroy()


m=Main()
Als Vorteil erscheint es mir aber, dass man die Position des Menüs wirklich beliebig festlegen kann.
Ergänzend:
Für das Text-Fenster mit Y-Scroller ist ScrolledText einfacher.

MfG
HWK
Antworten