TKinter Menü

Fragen zu Tkinter.
Antworten
Wittener Informatiker
User
Beiträge: 4
Registriert: Donnerstag 27. November 2008, 16:49
Wohnort: Witten
Kontaktdaten:

Hallo liebe Python User,

Ich habe folgendes Problem mit einem Menü. Und zwar sollen wir für die 5ten Klassen an unserer Schule ein Matheprogramm zum lernen schreiben, mit toolbar und so. Allerdings bekomme ich die Toolbar nicht in das Hauptfenster (fenter). Kann mir da mal jemand Helfen?

PS: aus den anderen Beiträgen hier im Forum bin ich nicht schlau geworden.

Code: Alles auswählen

# Marvin Duhn
# Design_01
# 18.11.08
  


def schliessen():
    fenster.quit()
    
    
    import Tkinter
    import sys

    class Gui(Tkinter.Tk):

        
        def __init__(fenster): 
            Tkinter.Tk.__init__(fenster,className="Mathe Lernprogramm")
            fenster.mBar = Tkinter.Menu(fenster)
            fenster.mFile = Tkinter.Menu(fenster.mBar)
            fenster.mFile.add_command(label="Level 1", command=fenster2)
            fenster.mFile.add_command(label="Beenden", command=schliessen)
            fenster.mBar.add_cascade(label="Level", menu=fenster.mFile)
            fenster.config(menu=fenster.mBar)
         
         
           
    def jusConf(fenster):
            pass
           
        
    if __name__ == "__main__":

        mf = Gui()

        Tkinter.mainloop()

        sys.exit(0)



    


def fenster2():
    
    global fenster
    fenster=Tk()
    fensterf=Frame(fenster,width=1000,height=900,bg='#fbff90')
    fensterf.pack()
    
    schalter=Frame(fenster,width=50,height=100)
    schalter.place(x=20,y=100)

    schalter1=Frame(fenster,width=50,height=100)
    schalter1.place(x=20,y=150)
    
    ueber=Label(fensterf,text='Mathelernprogramm',font='Arial 30',bg='#fbff90')
    ueber.place(x=350,y=10)
                    
    button=Button(schalter,text='schliessen',font='12', command=schliessen)
    button.pack()

    button1=Button(schalter1,text='beenden',font='12', command=schliessen)
    button1.pack()

    fensterg=Frame(fenster,bd=8, relief='ridge',width=800,height=700,bg='orange')
    fensterg.place(x=185,y=100)

    Text=Label(fensterg,text='Hallo',font='Arial 12',fg='black',bg='orange')
    Text.place(x=150,y=100) 
    
    root.destroy()


from Tkinter import*


root=Tk()
root.label=Label(root,text='!Willkommen beim Mathelernprogramm des 10er Info Kurses!', font='Arial 15')
root.label.pack()
root.button=Button(root,text='OK!',font='12', command=fenster2)
root.button.pack()
:evil: :twisted: :evil: :twisted:
Janux
User
Beiträge: 78
Registriert: Donnerstag 12. Juni 2008, 21:11

Ich kann dir zwar nicht direkt helfen aber auf jeden Fall kann ich dir den
Tipp geben deinen Code etwas zu entwirren.

1.) Tkinter wird am besten mit `import Tkinter as tk` importiert
2.) Warum importierst du Tkinter zwei mal?
3.) Es lässt sich im Forum besser lesen wenn du deinen Code in die Python-Code-Tags setzt
4.) Ich wüsste nicht wieso du deine GUI von Tkinter erben lassen solltest.

Auf dieser Seite müsstest du finden wie das mit den Menues geht....
http://effbot.org/tkinterbook/menu.htm

P.S. Muss das Mathe-Lernprogramm unbedingt eine GUI haben?

Edit: http://www.rg16.asn-wien.ac.at/~python/how2think/
Das ist bestimmt ganz interessant für dich
mfg ... Janux
Wittener Informatiker
User
Beiträge: 4
Registriert: Donnerstag 27. November 2008, 16:49
Wohnort: Witten
Kontaktdaten:

Danke für die recht schnelle antwort.

zu deiner Frage: Ja unser informatiklehrer möchte, dass wir nen GUI benutzen
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

ansonsten hätte ich hier eine schöne Klasse für ToolTip+Werkzeugleiste+Statusleiste (leider nicht von mir selber^^):
http://paste.pocoo.org/show/93549/

Wenn du fragen zum benutzen hast frag einfach^^
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Birne94

Hast du vielleicht noch ein kleines Beispiel-Progrämmchen, welches diese Klassen nutzt?

Gruss wuf :wink:
Take it easy Mates!
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

Code: Alles auswählen

root = Tk()
status = StatusBar(root)
toolbar = ToolBar(root,status)

toolbar.pack(fill=X)

## andere Widgets^^

status.pack(fill=X)

def f(): print "Hallo"

toolbar.add("button1",  # Interner Name
            "text",     # Text
            "icon.ext", # Bild
            f,          # Funktion
            "blablabla",# Hilfetext
)
toolbar.add_separator() # Separator einfügen

toolbar.set_enabled("button1",0)    # tool deaktivieren
root.mainloop()
müsste so gehen. es erstellt ein Fenster mit toolbar und statusbar.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Birne94

Besten Dank für dein Demo-Progrämmchen. Ich werde mir die Klassen noch genauer anschauen und damit herumexperimentieren, eventuell könnte man noch etwas erweitern. Sollte da noch etwas herauskommen informiere ich dich.

OK. Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wittener Informatiker hat geschrieben:Ich habe folgendes Problem mit einem Menü.
Um es mal vorsichtig auszudrücken: Du hast nicht nur ein Problem mit dem Menü! Dein Code ist grauenhaft, und zwar ganz unabhängig von Tkinter, Menü und der gestellten Aufgabe.

Bevor du dich weiter daran machst, das Programm irgendwie zusammenzufrickeln (ein fertiges Menü wirst du auch noch irgendwo auftreiben und als Baustein einbauen können ...), wäre es das beste, wenn du Energie darauf verwenden würdest, wirklich zu verstehen, was du da machst und wie man ein Programm aufbaut, damit man den Überblick behält.

Und was Tkinter angeht: Wo hast du gelernt, pack() und place() munter zu mischen? Ich hoffe, das war nicht dein Informatiklehrer, der dir das beigebracht hat.

Mein Vorschlag:
1. Code neu ordnen. Dabei hilft http://www.rg16.asn-wien.ac.at/~python/how2think/
(der Link wurde dir ja schon genannt - ich wiederhole ihn einfach nochmal ...)

2. In die Grundlagen von Tkinter einlesen: http://www.ferg.org/thinking_in_tkinter ... grams.html

3. Parallel zum Einlesen in Tkinter dir Gedanken über den Rest des Programm und die Logik machen. Das Menü kannst du am Ende immer noch ergänzen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:Ich werde mir die Klassen noch genauer anschauen und damit herumexperimentieren, eventuell könnte man noch etwas erweitern.
Dann kannst du ja als erstes mal dafür sorgen, dass die Statusleiste auch immer unten bleibt, wenn man das Fenster aufzieht ... :wink:

Nee, ist schon eine nette Sache. Vor allem das mit den Tooltips gefällt mir gut.
Wittener Informatiker
User
Beiträge: 4
Registriert: Donnerstag 27. November 2008, 16:49
Wohnort: Witten
Kontaktdaten:

numerix hat geschrieben:
Wittener Informatiker hat geschrieben:Ich habe folgendes Problem mit einem Menü.
Um es mal vorsichtig auszudrücken: Du hast nicht nur ein Problem mit dem Menü! Dein Code ist grauenhaft, und zwar ganz unabhängig von Tkinter, Menü und der gestellten Aufgabe.

Bevor du dich weiter daran machst, das Programm irgendwie zusammenzufrickeln (ein fertiges Menü wirst du auch noch irgendwo auftreiben und als Baustein einbauen können ...), wäre es das beste, wenn du Energie darauf verwenden würdest, wirklich zu verstehen, was du da machst und wie man ein Programm aufbaut, damit man den Überblick behält.

Und was Tkinter angeht: Wo hast du gelernt, pack() und place() munter zu mischen? Ich hoffe, das war nicht dein Informatiklehrer, der dir das beigebracht hat.

Mein Vorschlag:
1. Code neu ordnen. Dabei hilft http://www.rg16.asn-wien.ac.at/~python/how2think/
(der Link wurde dir ja schon genannt - ich wiederhole ihn einfach nochmal ...)

2. In die Grundlagen von Tkinter einlesen: http://www.ferg.org/thinking_in_tkinter ... grams.html

3. Parallel zum Einlesen in Tkinter dir Gedanken über den Rest des Programm und die Logik machen. Das Menü kannst du am Ende immer noch ergänzen.
Doch mein Info lehrer hat mir das so gezeigt:-)
abgdf

Hi,

ich benutze dieses Perl/Tk-Tutorial:

http://wiki.perl-community.de/bin/view/ ... lKapitel13

Daher sieht das bei mir in Python/Tkinter meistens so aus (hat ein paar Monate gedauert, bis ich das raus hatte (war eines der ersten Sachen, die ich machen wollte, aber Tkinter lernen, dauert halt etwas)):

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import Tkinter
from Tkconstants import *

import tkMessageBox

class MainWindow:

    def __init__(self):

        self.mw = Tkinter.Tk()
        self.mw.title("Menu-Demo")
        self.mw.geometry("+85+120")
        self.mw.option_add("*font", 'Arial 14')
        self.mw.option_add("*tearOff", "false")

        self.tfield = Tkinter.Text(self.mw,
                                   background = 'white',
                                   foreground = 'black',
                                   width = 82,
                                   height = 20,
                                   font = "Courier 12")

        # A frame containing some menubuttons:

        self.menubar = Tkinter.Frame(self.mw, relief = 'ridge', bd = 5);

        # The menubuttons

        self.mb_file = Tkinter.Menubutton(self.menubar, text = "Datei")
        self.mb_bearb = Tkinter.Menubutton(self.menubar, text = "Bearbeiten")
        # Several menues associated with the menubuttons:

        self.menu_file = Tkinter.Menu(self.mb_file)

        self.menu_file.insert_command(0,
                                      label = "Speichern",
                                      command = self.saveit,
                                      state = "disabled")

        self.menu_file.insert_separator(1)
        self.menu_file.insert_command(2,
                                      label = "Beenden",
                                      command = self.mw.destroy)
        self.mb_file.config(menu = self.menu_file)

        self.menu_bearb = Tkinter.Menu(self.mb_bearb)
        self.menu_bearb.insert_command(0,
                                       label = "Bearbeiten",
                                       command = self.bearbeiten,
                                       state = "normal")
        self.mb_bearb.config(menu = self.menu_bearb)

        self.menubar.pack(side = "top", fill = "x")
        self.mb_file.pack(side = "left")
        self.mb_bearb.pack(side = "left")

        self.tfield.pack(side = 'left', expand = 1, fill   = 'both')

        self.mw.mainloop()

    def bearbeiten(self):

        tkMessageBox.showinfo(title = "Hallo",
                               message = "Wird bearbeitet.")

    def saveit(self):
        pass

app = MainWindow() 
Ein Statusbar-Beispiel hab' ich hier auch noch rumliegen :):

Code: Alles auswählen

#!/usr/bin/env python

import Tkinter

from Tkconstants import *

class myWindow:

    def __init__(self):

        self.numclicks = 0

        self.mw = Tkinter.Tk()
        self.mw.option_add("*font", ("Arial", 15, "normal"))
        self.mw.geometry("+320+235")
        self.mw.title("Statusbar-Demonstration")

        self.btn1 = Tkinter.Button(self.mw, text = "Press", command = self.btnClick)
        self.btn1.pack(padx = 150, pady = 50)

        self.btn2 = Tkinter.Button(self.mw, text = "Exit", command = self.mw.destroy)
        self.btn2.pack(anchor = E, padx = 20, pady = 20)

        self.sbar = StatusBar(self.mw)
        self.sbar.pack(side = BOTTOM, fill = BOTH)
  
        self.sbar.set("Waiting.")

        self.mw.mainloop()

    def btnClick(self):

        self.numclicks += 1
        self.sbar.set("Button pressed " + str(self.numclicks) + " times.")

class StatusBar(Tkinter.Frame):

    def __init__(self, master):

        Tkinter.Frame.__init__(self, master)
        self.label = Tkinter.Label(self,
                                   bd = 1,
                                   relief = SUNKEN,
                                   anchor = W)
        self.label.pack(fill = X)

    def set(self, format):
        self.label.config(text = format)
        self.label.update_idletasks()

    def clear(self):
        self.label.config(text = "")
        self.label.update_idletasks()

if __name__ == "__main__":
   app = myWindow()
HTH
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Wittener Informatiker

Dein Code-Snippet brachte mich ein wenig durcheinander. Ich dache zuerst da gibt es eine neue Art wie man sich eine Tk-GUI erstellt. Der Grund hierfür ist, dass man sich mit der Zeit einen ganz bestimmte Gangart aneignet das GUI-Problem zu lösen. :D
Doch mein Info lehrer hat mir das so gezeigt :-)
Da musst du deinem 'Info Lehrer' unbeding zeigen wie man das besser macht.

Vielleicht has du schon einiges herausgefunden anhand den Tipps von 'Janux' und 'numerix'. Wichtig ist auch noch der Punkt-3 von 'numerix'. Vielleicht kannst du einen kurzen Beschrieb über das gewünschte Verhalten deiner Anwendung erstellen. Ich habe aus deinem Code-Snippet herausgelesen, dass es da ein Label gibt, welches als Text-Logo verwendet wird und eine Schaltfläche 'OK' mit der auf die eigentliche Anwendung (Fenster-2) umgeschalten wird. In diesem Fenster-2 mit gelbem Hintergrund hat es ein weiterer orange-farbigen Rahmen und im gelben Bereich gibt es links noch zwei Schaltflächen 'Schliessen' und 'Beenden'. Ist das so in etwa richtig?

Frage: Das Label mit dem Logo-Text "!Willkommen beim Mathelernprogramm des 10er Info Kurses!" plus die Schaltfläche 'OK' brauchst du eigentlich nur für den Start. Sobald die OK-Schaltfläche aktiviert wurde und das Anwendungsfenster (Fenster-2) sichbar könnten dieses Label und die Schaltfäche entfernt werden? Man braucht hierfür auch nicht unbeding zwei Fenster. Übrigens man sollte nicht zwei Hauptfenster-Instanzen von Tk() erzeugen. Weiter Fenster neben dem Hauptfenster werden mit Instanzen von der Tk-Klasse 'Toplevel' erzeugt.

@numerix: Danke noch für den Tipp mit der 'Statusbar' :wink:

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo abgdf

Danke auch noch für deine Code-Snippets. Die enthalten ja schon einige gute Lösungsansätze.

Gruss wuf :wink:
Take it easy Mates!
abgdf

Hallo,

jetzt hab' ich nach einiger Zeit meine Computertexte mal wieder online gestellt:

http://www.angelfire.com/linux/tux25/

Gerade Python und Tkinter

http://www.angelfire.com/linux/tux25/python/python.html
http://www.angelfire.com/linux/tux25/py ... inter.html

ließen sich soweit recht gut darstellen ...

Viele Grüße

P.S: Ach so, für die Seiten bitte JavaScript ausschalten wegen Werbung: Ist halt kostenloser Webspace.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``readlines()`` vorzustellen ist sinnlos, man kann direkt Zeilenweise über Dateien iterieren ohne Speicher zu verbrauchen. ``random.seed()`` ist auch i.d.R. nicht nötig. ``sre`` würde ich auch nicht empfehlen sondern eher ``re``. Für Daten gibt es inzwischen ``datetime``. Für Subprozesse ``subprocess``. ``compileall`` kann man inzwischen direkt über den Python-Prompt mit ``python -m compileall [pfad]`` aufrufen. Stern-Imports würde ich auch nicht anraten. ``while 1:`` würde man eher durch ``while True:`` ersetzen, im konkreten Beispiel wohl aber eher mit ``cursor.fetchall()``.

Das Dokument ist ziemlich veraltet und kaum empfehlenswert. Nach der Lektüre würde ich eher zu [wiki]Neue Features[/wiki] raten. Oder gleich mit etwas beginnen das weniger veraltet ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
abgdf

Richtig ist, ich bin immer noch bei Python 2.4, SuSE 10.0 und einem Rechner von 2003. Da ich nicht neue 3D-Spiele zocke, geht das recht gut.
Alle Features auf der Seite sind von mir getestet und funktionieren in 2.4. Da ich schon denke, daß sich die Python-Programmierer auch um Abwärtskompatibilität bemühen, funktioniert das, was auf meiner Seite steht, immer noch. Man könnte heute das eine oder andere vielleicht etwas moderner machen, insgesamt abraten muß man aber nicht.

Gruß
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

abgdf hat geschrieben:Man könnte heute das eine oder andere vielleicht etwas moderner machen, insgesamt abraten muß man aber nicht.
Klar, Deprecation warnings und schwerere Migration auf neuere Releases die sowas gar nicht mehr haben ist toll. Auch der zusätzliche unnötige Speicherverbrauch ist sicher sinnvoll. Also ehrlich, direkt über Dateien zu iterieren geht schon seit Ewigkeiten. ``readlines()`` hat schon unter 2.4 niemand mehr genutzt.

Außerdem bekommen die Kommentare alle zu hören die dann die Anleitung lesen und ihren Code dann irgendwo posten. Warum es also nicht gleich in der Dokumentation an der Zentralen Stelle aktuell halten statt den Leuten Dinge zu vermitteln die sie dann später sowieso anders machen werden so dass das alte Wissen keinen Wert hat? Zudem ich ja durchaus schon viele Stellen angesprochen habe so dass du dir nichtmal die Arbeit machen musst selbst nach den Dingen zu suchen die outdated sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Blanka
User
Beiträge: 1
Registriert: Dienstag 24. Februar 2009, 14:28

Ich habe ein kleines Problem mit einem Menu, das ich für ein Programm benötige:

Code: Alles auswählen

#Menu
menubar=Tkinter.Menu(tk)
dateiMenu=Tkinter.Menu(menubar)
arbeitMenu=Tkinter.Menu(menubar)
hilfeMenu=Tkinter.Menu(menubar)
dateiMenu.config(bg="#FFEC8B")
arbeitMenu.config(bg="#FFEC8B")
hilfeMenu.config(bg="#FFEC8B")
dateiMenu.add_command(label="Neues Projekt",command=bla)
dateiMenu.add_command(label="Projekt oeffnen", command=bla)
dateiMenu.add_command(label="Projekt speichern", command=bla)
dateiMenu.add_command(label="Rangliste drucken", command=bla)
dateiMenu.add_command(label="Projekt schliessen", command=bla)
arbeitMenu.add_command(label="Station erstellen", command=bla)
arbeitMenu.add_command(label="Station einlesen", command=bla)
arbeitMenu.add_command(label="Aenderungen", command=bla)
hilfeMenu.add_command(label="Hilfe", command=bla)
menubar.add_cascade(label="Datei", underline=0,menu=dateiMenu)
menubar.add_cascade(label="Bearbeiten",underline=0,menu=arbeitMenu)
menubar.add_cascade(label="Hilfe", underline=0,menu=hilfeMenu)
tk.configure(menu=menubar)
Mein Problem ist nun, dass einfach ein Separator hinzugefügt wird, den ich ja aber gar nicht einfüge... Warum und wie kriege ich den weg?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Blanka hat geschrieben:Ich habe ein kleines Problem mit einem Menu, das ich für ein Programm benötige:
Hallo Blanka, willkommen im Forum!

Positiv ist, dass du die Code-Tags gleich entdeckt hast ... :wink:

Empfehlung für künftige Postings:
Entweder lauffähigen Code posten (das wäre in diesem Fall das beste, damit man sich ansehen kann, was du unter Separatoren verstehst - es sind nämlich keine ...) oder Snippets, die so sind, dass man sich nicht den Rest erraten muss, um lauffähigen Code daraus zu machen (was ist z.B. tk ?).

Und: Bei älteren Threads wie diesem ist es meist besser, einen neuen zu eröffnen, weil man sich ansonsten möglicherweise völlig umsonst den ganzen Thread nochmal ansieht, um am Ende festzustellen, dass das überflüssig war.

Jetzt aber die Lösung: Was dich stört sind keine Separatoren (die müsste man nämlich ausdrücklich hinzufügen), sondern die sog. Abreißleiste. Das ist ein besonderes Feature. Wenn du darauf klickst, kannst du das Menü abreißen und als eigenständiges Fenster herumschieben.
Wenn du das nicht willst, musst du bei der Erzeugung den Schlüsselwortparameter "tearoff=False" setzen - dann ist die Abreißleiste weg:

Code: Alles auswählen

dateimenu = Tkinter.Menu(menubar, tearoff=False)
Im übrigen könnte dein Code auch noch stylistische Verbesserungen vertragen. "PEP 8" ist hier das Stichwort.
Antworten