Brauche Hilfe beim erstellen meiner Gui...

Fragen zu Tkinter.
Antworten
E1sbaer
User
Beiträge: 9
Registriert: Donnerstag 26. April 2007, 08:57

Huhu... ist irgendwie doch nen bisl schwerer den Einstieg zu finden als ich dachte... Also ich hab folgendes vor:

Eine Gui die ich unter Windows automatisch beim start des Systems öffne und die dann Windows komplett verdeckt. Also nicht nur ein maximiertes Fenster, sondern ein Vollbild.

In der Gui möchte ich 3 Knöpfe unterbringen die später mal andere Programme starten.

Die Knöpfe sollen schön aussehen (Bilder die ich anklicken kann oder so...) und in meiner Gui würd ich auch gern nen Hintergrundbild unterbringen.

Bisher bin ich soweit: (bitte nicht lachen oder schimpfen...) :oops:

Code: Alles auswählen

#File: Bruno.pyw

from Tkinter import *
import popen2,subprocess,os

class App: 
    def __init__(self,master):
        frame=Frame(master)
        frame.pack()
        self.startp1=Button(frame,text='startP1', fg='red', command=self.say_p1)
#halt mal mit roter Schrifft aber nicht mit Bild...
        self.startp1.pack(side=LEFT) 
        self.startp2=Button(frame,text='startP2',command=self.say_p2)
        self.startp2.pack(side=LEFT)
        self.startp3=Button(frame,text='startP3',command=self.say_p3)
        self.startp3.pack(side=LEFT)
    def say_p1(self):
        print 'Programm 1 wird gestartet...!'
        os.system("C:\Programme\meinProgramm1\meinprogramm1.exe")
#das geht schon ganz gut
    def say_p2(self):
        print 'Programm 2 wird gestartet...!'
        os.system("C:\Programme\meinProgramm2\meinprogramm2.exe")
    def say_p3(self):
        print 'Programm 3 wird gestartet...!'
        os.system("C:\Programme\meinProgramm3\meinprogramm3.exe")
root=Tk()
app=App(root)
root.mainloop() 
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
bei einem Problem kann ich dir schon helfen.

Code: Alles auswählen

#File: Bruno.pyw

from Tkinter import *
import popen2,subprocess,os

class App:
    def __init__(self,master):
        frame=Frame(master)
        frame.pack()
        self.startp1=Button(frame,text='startP1', fg='red', command=self.say_p1)
        #halt mal mit roter Schrifft aber nicht mit Bild...
        self.startp1.pack(side=LEFT)
        self.startp2=Button(frame,text='startP2',command=self.say_p2)
        self.startp2.pack(side=LEFT)
        self.startp3=Button(frame,text='startP3',command=self.say_p3)
        self.startp3.pack(side=LEFT)
    def say_p1(self):
        print 'Programm 1 wird gestartet...!'
        #~ os.system("C:\Programme\meinProgramm1\meinprogramm1.exe")
        #das geht schon ganz gut
    def say_p2(self):
        print 'Programm 2 wird gestartet...!'
        #~ os.system("C:\Programme\meinProgramm2\meinprogramm2.exe")
    def say_p3(self):
        print 'Programm 3 wird gestartet...!'
        #~ os.system("C:\Programme\meinProgramm3\meinprogramm3.exe")
        
def _main():
    root=Tk()
    root.state('zoomed')
    root.overrideredirect( 1 )
    Button(root, text='quit', command=quit).pack(side=BOTTOM) 
    app=App(root)
    root.mainloop()
    
if __name__=='__main__':
       _main()
Gruss
pyStyler
Zuletzt geändert von pyStyler am Donnerstag 3. Mai 2007, 14:23, insgesamt 2-mal geändert.
E1sbaer
User
Beiträge: 9
Registriert: Donnerstag 26. April 2007, 08:57

Danke cool, jetzt fehlt ja eigentlich nur noch das hübsch bunte...

Hat einer ne Ahnung wie man das generell macht?

Mfg Bär
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi!
Fast alle Widgets haben eigentlich das image-Argument mit dem du ihnen ein Objekt vom Typ PhotoImage übergeben kannst. Dh. je nach dem, wie du die Buttons platzieren willst, bzw. ob du sonst noch was machen willst, nimmst du einfach ein dein Frame, übergibst ihm das Hintergrundbild und positionierst die Buttons, denen du auf die gleiche Art ein Bild Übergibst.
Evtl. setzt du bei den Buttons 'relief' noch auf "flat", dann müsste mann nur noch deine Bilder sehen.

Wenn du alles ganz genau positionieren willst, nimm den place-Layout-Manager, oder nimm statt des Frames ein Canvas. Da kannst du andere Widgets mit 'create_window' reinbauen, alles pixelgenau positionieren und zudem noch selbst was zeichnen.

Gruß, jj
E1sbaer
User
Beiträge: 9
Registriert: Donnerstag 26. April 2007, 08:57

Ich versteht es einfach nicht. Ich hab nen Button der auch die größe des gifs einnimmt, aber das gif seh ich einfach nicht.

Mit dem Hintergrund verzweifel ich total... Der code sieht derzeit so aus:

Code: Alles auswählen

#File: Brunov01.pyw 

from Tkinter import * 
import os

class App:
    def __init__(self,master):
        #self.fenster = Tk()
        #gif = PhotoImage(file='E:/bruno/hintergr.gif')
        #self.bild = Label (self.fenster, width='5c', height = '3c', image = gif)
        #self.bild.pack()

        frame=Frame(master)
        frame.pack()

        icon=PhotoImage(file="bilder\DerOBaer.gif")
        #Button(self.fenster, image=icon,
        #       command=self.say_p3).pack()

        Button(image=icon).pack()
        
        self.startp1=Button(frame,image=icon, command=self.say_p1) 
        self.startp1.pack(side=LEFT) 
        self.startp2=Button(frame,text='startP2',command=self.say_p2) 
        self.startp2.pack(side=LEFT) 
        self.startp3=Button(frame,text='startP3',command=self.say_p3) 
        self.startp3.pack(side=LEFT)

    def say_p1(self): 
        print 'Programm 1 wird gestartet...!' 
        os.system("Start /max ZDF-Idealburg\start.exe") 
    def say_p2(self): 
        print 'Programm 2 wird gestartet...!' 
        os.system("Start /max ZDF-Ritter\start.exe") 
    def say_p3(self): 
        print 'Programm 3 wird gestartet...!' 
        os.system("Start /max Mittelalter\start.exe") 

       
root=Tk() 
root.state('zoomed') 
root.overrideredirect( 1 )
app=App(root) 
root.mainloop() 
BlackJack

Bei `Tkinter` muss man aufpassen, dass Grafiken auf der Python-Seite referenziert bleiben. Binde das `icon` mal an das `App`-Objekt, sonst wird der Speicher für die Grafik wieder freigegeben, wenn die `__init__()`-Methode abgearbeitet wurde.
E1sbaer
User
Beiträge: 9
Registriert: Donnerstag 26. April 2007, 08:57

Bin jetzt fast fertig dank eurer Hilfe, mir fehlt aber noch ein Tipp zum finalen Abschluss. Wie bekomm ich ein Fenster hin, dass mein Hintergrundbild zeigt und an dem ich meine 3 Knöpfe an von mir bestimmte Positionen setzen kann.

Hier der aktuelle Code der leider nicht wirklich taugt...

Code: Alles auswählen

#File: Brunov01.pyw 

from Tkinter import * 
import os

class App:
    def __init__(self,master):
        self.fenster = Tk(master)
        self.hintergru = PhotoImage(file="bilder\hintergr.gif")
        self.bild = Label(self.fenster,width='10c',height='10c',image = self.hintergru)
        self.bild.pack()

        #frame=Frame(master)
        #frame.pack()

        self.icon1=PhotoImage(file="bilder\DerOBaer.gif")
        self.startp1=Button(self.bild,image=self.icon1,text='startP2',command=self.say_p1) 
        self.startp1.pack(side=LEFT)
        
        self.icon2=PhotoImage(file="bilder\DerOBaer.gif")
        self.startp2=Button(self.bild,image=self.icon2,text='startP2',command=self.say_p2) 
        self.startp2.pack(side=LEFT)
        
        self.icon3=PhotoImage(file="bilder\DerOBaer.gif")
        self.startp3=Button(self.bild,image=self.icon3,text='startP3',command=self.say_p3) 
        self.startp3.pack(side=LEFT)

    def say_p1(self): 
        print 'Programm 1 wird gestartet...!' 
        os.system("Start /max ZDF-Idealburg\start.exe") 
    def say_p2(self): 
        print 'Programm 2 wird gestartet...!' 
        os.system("Start /max ZDF-Ritter\start.exe") 
    def say_p3(self): 
        print 'Programm 3 wird gestartet...!' 
        os.system("Start /max Mittelalter\start.exe") 

       
root=Tk()
root.state('zoomed') 
root.overrideredirect( 1 )
app=App(root) 
root.mainloop() 
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

schlangenbeschwörer hat geschrieben:Hi!

Wenn du alles ganz genau positionieren willst, nimm den place-Layout-Manager, oder nimm statt des Frames ein Canvas. Da kannst du andere Widgets mit 'create_window' reinbauen, alles pixelgenau positionieren und zudem noch selbst was zeichnen.

Gruß, jj
:wink:

PS: Tk(master) geht nicht.
E1sbaer
User
Beiträge: 9
Registriert: Donnerstag 26. April 2007, 08:57

Mein Programm ist inzwischen echt hübsch geworden, nicht zuletzt durch eure Hilfe und dann noch noch mal ein python Buch aus der Uni-Bib.

Um vielleicht dem ein oder anderen der auf ähnlichen Suchen ist wie ich es war zu helfen,hier auch meine vorerst letzte Version meines Programmes.

Code: Alles auswählen

#File: Brunov.pyw 

from Tkinter import * 
import os

class App(object):
    def __init__(self):

        self.fenster = Tk()

        self.canvas = Canvas(self.fenster, width=1024, height=768)
        self.hintergrund = PhotoImage(file="bilder\Back1.gif")
        self.canvas.create_image(0, 0, image=self.hintergrund, anchor=NW)
        self.canvas.pack()

        self.__initButton1()
        self.__initText1()
        self.__initButton2()
        self.__initText2()
        self.__initButton3()
        self.__initText3()
        self.fenster.state('zoomed')#Programm wird maximiert ausgefuehrt
        self.fenster.overrideredirect(1)#Programm wird ohne Fensterraender ausgefuehrt
        self.fenster.mainloop()
        
    def say_p1(self): 
        print 'Programm 1 wird gestartet...!' 
        os.system("Start /max ZDF-Idealburg\start.exe") 
    def say_p2(self): 
        print 'Programm 2 wird gestartet...!' 
        os.system("Start /max ZDF-Ritter\start.exe") 
    def say_p3(self): 
        print 'Programm 3 wird gestartet...!' 
        os.system("Start /max Mittelalter\start.exe")
        
    def __initButton1(self):        
        self.icon1=PhotoImage(file="bilder\Burg.gif")
        self.startp1=Button(image=self.icon1,width='2c',height='2c',command=self.say_p1)
        self.canvas.create_window('7c','17c',window=self.startp1)
    def __initText1(self):
        self.canvas.create_text('5.8c','19c',text='Burgen',font=('Comic Sans MS', 20),fill='white',anchor=W)

    def __initButton2(self):        
        self.icon2=PhotoImage(file="bilder\Ritter.gif")
        self.startp2=Button(image=self.icon2,width='2c',height='2c',command=self.say_p2) 
        self.canvas.create_window('14c','17c',window=self.startp2)
    def __initText2(self):
        self.canvas.create_text('12.9c','19c',text='Ritter',font=('Comic Sans MS', 20),fill='white',anchor=W)

    def __initButton3(self):        
        self.icon3=PhotoImage(file="bilder\Mittelalter.gif")
        self.startp3=Button(image=self.icon3,width='2c',height='2c',command=self.say_p1)
        self.canvas.create_window('21c','17c',window=self.startp3)

    def __initText3(self):
        self.canvas.create_text('19.1c','19c',text='Mittelalter',font=('Comic Sans MS', 20),fill='white',anchor=W)
        
app=App()
Zusehen ist, nach dem ausführen des Codes ein Hintergrundbild im Vollbild ohne Fenster. Zusätzlich sind 3 Buttons / Knöpfe unter gebracht die jeweils ein Bild zeigen. Da man nur entweder Text oder Bild anzeigen kann habe ich zusätzlich jeweils eine Beschreibung darunter eingefügt.

Dieses Programm hat keinen Beenden-Knopf, da dies verhindern soll das Kinder die die Oberfläche bedienen sollen nicht an das Windowssystem kommen und irgend etwas umstellen können. Die ganze Bedienung soll nur über eine Maus bereitgestellt werden.

Ich werde nun noch versuchen für eine angenehmere Wartung eine Abfrage ein zubauen das beim Drücken der Esc-Taste das Programm beendet wird. Mal sehen ob ich das auch noch schaffe.

Liebe Grüße
und noch mal vielen lieben Dank an alle Helfer

Eisbär
Antworten