TKinter Menü

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

Dienstag 2. Dezember 2008, 13:21

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

Dienstag 2. Dezember 2008, 15:10

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:

Dienstag 2. Dezember 2008, 15:13

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:

Dienstag 2. Dezember 2008, 16:24

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: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 2. Dezember 2008, 16:49

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:

Dienstag 2. Dezember 2008, 17:32

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: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 2. Dezember 2008, 17:56

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

Dienstag 2. Dezember 2008, 18:08

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

Dienstag 2. Dezember 2008, 18:11

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:

Dienstag 2. Dezember 2008, 18:19

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

Dienstag 2. Dezember 2008, 18:24

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: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 2. Dezember 2008, 19:03

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: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 2. Dezember 2008, 19:11

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

Donnerstag 4. Dezember 2008, 21:48

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 4. Dezember 2008, 22:03

``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 Modvoice
Antworten