neues Fenster im Hauptfenster einbinden

Fragen zu Tkinter.
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo Forum,

ich hätte mal eine generelle frage:
hab nun ein Fenster mit Tkinter erzeugt, wenn ich nun auf den Menubutton "Programm1" gehe, erscheint ein neues Fenster.
Ist es möglich dieses neue Fenster in das Hauptfenster mit einzubetten? sprich es wird immer nur ein Fenster angezeigt?

bitte um kurze Info.

vielen Dank


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 
from tkinter import *
from tkinter import messagebox
import os
    
def showversion():
    messagebox.showinfo("info", "\
************************\n\
Version: 1.00\n\
************************")
        

def Programm1():

    Programm1 = Tk()
    window = Label(Programm1)
    
    var1 = StringVar(Programm1)
    var2 = StringVar(Programm1)
    var3 = StringVar(Programm1)
    var4 = StringVar(Programm1)
    var5 = Entry(Programm1)
    var6 = Entry(Programm1)
    
    Label(Programm1, text = "Standard", bg="#ffffbb", pady=10,padx=100).grid (row=3, columnspan=20)
    Label(Programm1, text="Eingabe1").grid(row=0)
    Label(Programm1, text="Eingabe2").grid(row=1) 
    var5.grid(row=0, column=1)
    var6.grid(row=1, column=1)

Hauptfenster = Tk(className=" Hauptfenster Konfigurationstool")
menubar = Menu(Hauptfenster, bg="#000000")
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Programm 1", command=Programm1)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=Hauptfenster.quit)
menubar.add_cascade(label="Skripte", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_separator()
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About...", command=showversion)
menubar.add_cascade(label="Help", menu=helpmenu)
Hauptfenster.config(menu=menubar)
Hauptfenster.mainloop()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi erdmulch

Wie gefällt dir dies:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 
from tkinter import *
from tkinter import messagebox
import os
    
def showversion():
    messagebox.showinfo("info", "\
************************\n\
Version: 1.00\n\
************************")
        

def Programm1():
    entry_frame = Frame(Hauptfenster)
    
    var1 = StringVar()
    var2 = StringVar()
    
    Entry(entry_frame, textvariable=var1).grid(row=0, column=1)
    Entry(entry_frame, textvariable=var2).grid(row=1, column=1)
    
    Label(entry_frame, text="Eingabe1").grid(row=0)
    Label(entry_frame, text="Eingabe2").grid(row=1)
     
    Label(entry_frame, text="Standard", bg="#ffffbb", pady=10,padx=100
        ).grid (row=3, columnspan=20)
    
    entry_frame.pack()
    
Hauptfenster = Tk(className=" Hauptfenster Konfigurationstool")
menubar = Menu(Hauptfenster, bg="#000000")
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Programm 1", command=Programm1)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=Hauptfenster.quit)
menubar.add_cascade(label="Skripte", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_separator()
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About...", command=showversion)
menubar.add_cascade(label="Help", menu=helpmenu)
Hauptfenster.config(menu=menubar)
Hauptfenster.mainloop()
Gruss wuf :-)
Take it easy Mates!
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Fast perfekt ;-)

Wenn ich im Menü "Programm1" auswähle, wird dieses richtigerweise im Hauptfenster eingebettet.
Wenn ich nun nochmals auf das Programm1 klicke, dann erscheint Programm1 nochmals.
Es sollte aber immer nur einmal geöffnet sein
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi

Eine Lösungsmöglichkeit ist:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
from tkinter import *
from tkinter import messagebox
import os
    
def showversion():
    messagebox.showinfo("info", "\
************************\n\
Version: 1.00\n\
************************")
        

def Programm1():
    if Hauptfenster.embedded_window != None: return
    
    entry_frame = Frame(Hauptfenster)
    
    var1 = StringVar()
    var2 = StringVar()
    
    Entry(entry_frame, textvariable=var1).grid(row=0, column=1)
    Entry(entry_frame, textvariable=var2).grid(row=1, column=1)
    
    Label(entry_frame, text="Eingabe1").grid(row=0)
    Label(entry_frame, text="Eingabe2").grid(row=1)
     
    Label(entry_frame, text="Standard", bg="#ffffbb", pady=10,padx=100
        ).grid (row=3, columnspan=20)
    
    entry_frame.pack()
    Hauptfenster.embedded_window = entry_frame
    
    
Hauptfenster = Tk(className=" Hauptfenster Konfigurationstool")
Hauptfenster.embedded_window = None

menubar = Menu(Hauptfenster, bg="#000000")
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Programm 1", command=Programm1)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=Hauptfenster.quit)
menubar.add_cascade(label="Skripte", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_separator()
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About...", command=showversion)
menubar.add_cascade(label="Help", menu=helpmenu)
Hauptfenster.config(menu=menubar)
Hauptfenster.mainloop()
Gruss wuf :-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@erdmulch: Ich wollte noch auf einen Fehler im ursprünglichen Programm hinweisen: Es darf immer nur *ein* Exemplar von `Tk` geben, nicht zwei. Das ist *das* Hauptfenster, da hängt der ganze Tk/Tcl-Kram dran. Wenn es den zweimal gibt, können komische Dinge passieren, bis hin zu harten Programmabstürzen. Für zusätzliche Fenster ist `Toplevel` gedacht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo,

erstmals vielen Dank für die schnelle Antwort.
was tkinter betrifft bin ich einfach noch Anfänger.

wenn ich nun ein Bild einbinden will, dann erscheint dieses auf dem Hauptfenster und im Fenster von Programm1
Es sollte aber nur unter dem Hauptfenster erscheinen. Was mach ich falsch?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
from tkinter import *
from tkinter import messagebox
import os
    
def showversion():
    messagebox.showinfo("info", "\
************************\n\
Version: 1.00\n\
************************")
        

def Programm1():
    if Hauptfenster.embedded_window != None: return
    
    entry_frame = Frame(Hauptfenster)
    
    var1 = StringVar()
    var2 = StringVar()
    
    Entry(entry_frame, textvariable=var1).grid(row=0, column=1)
    Entry(entry_frame, textvariable=var2).grid(row=1, column=1)
    
    Label(entry_frame, text="Eingabe1").grid(row=0)
    Label(entry_frame, text="Eingabe2").grid(row=1)
     
    Label(entry_frame, text="Standard", bg="#ffffbb", pady=10,padx=100
        ).grid (row=3, columnspan=20)
    
    entry_frame.pack()
    Hauptfenster.embedded_window = entry_frame
    
    
Hauptfenster = Tk(className=" Hauptfenster Konfigurationstool")
logo = PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
window = Label(Hauptfenster, image=logo).pack(side="right")
Hauptfenster.embedded_window = None

menubar = Menu(Hauptfenster, bg="#000000")
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Programm 1", command=Programm1)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=Hauptfenster.quit)
menubar.add_cascade(label="Skripte", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_separator()
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About...", command=showversion)
menubar.add_cascade(label="Help", menu=helpmenu)
Hauptfenster.config(menu=menubar)
Hauptfenster.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@erdmulch: Du hast da kein Fenster von Programm 1, das ist ein `Frame`. Und den packst Du ins Fenster. Und in dem Fenster ist halt schon eine Grafik wo Du den Frame dazu packst. Dann ist da eben beides drin.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

stimmt. aber kann ich es dennoch igendwie ausblenden?
Im Moment sehe ich keine Möglichkeit...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi erdmulch

Ich nehme an dein Skript wird noch wachsen. Dann musst du unbedingt darauf achten, dass nicht der ganze Code an einem Haufen auf Modulebene platziert wird. Habe das ganze ein bisschen strukturiert. Den Import mit Stern ersetzt:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import os
import tkinter as tk
from tkinter import messagebox

APP_TITLE = "Hauptfenster"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200


class MeineAnwendung(object):

    def __init__(self, hauptfenster):
        self.hauptfenster = hauptfenster
        self.menu(hauptfenster)

        self.entry_01 = tk.StringVar()
        self.entry_02 = tk.StringVar()
        
        self.enbbeded_frame = self.create_embbeded_frame(hauptfenster)
        self.hide_embbeded_frame()
        
        self.create_picture(hauptfenster)
        
    def menu(self, hauptfenster):
        menubar = tk.Menu(hauptfenster, bg='gray70') #bg="#000000")
        
        # Erstelle das Skripte
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(
            label="Programm 1", command=self.show_embedded_frame)
        filemenu.add_separator()
        filemenu.add_command(
            label="Exit", command=hauptfenster.quit)
        menubar.add_cascade(
            label="Skripte", menu=filemenu)
        
        # Erstelle das Help
        editmenu = tk.Menu(menubar, tearoff=0)
        editmenu.add_separator()
        helpmenu = tk.Menu(menubar, tearoff=0)
        helpmenu.add_command(label="About...", command=self.show_version_info)
        menubar.add_cascade(label="Help", menu=helpmenu)
        
        hauptfenster.config(menu=menubar)
    
    def create_embbeded_frame(self, hauptfenster):
        frame = tk.Frame(hauptfenster)
        frame.grid(row=0, column=0)
                
        tk.Entry(frame, textvariable=self.entry_01).grid(row=0, column=1)
        tk.Entry(frame, textvariable=self.entry_02).grid(row=1, column=1)
        
        tk.Label(frame, text="Eingabe1").grid(row=0)
        tk.Label(frame, text="Eingabe2").grid(row=1)
         
        tk.Label(frame, text="Standard", bg="#ffffbb", pady=10
            ).grid (row=3, columnspan=2, sticky='we')

        tk.Button(frame, text="Schliessen", command=self.hide_embbeded_frame
            ).grid(row=4, columnspan=2)    
        return frame
    
    def create_picture(self, hauptfenster):
        self.logo = PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
        tk.Label(hauptfenster, image=self.logo).grid(row=2,column=0)
            
    def show_embedded_frame(self):
        self.enbbeded_frame.grid()
    
    def hide_embbeded_frame(self):
        self.enbbeded_frame.grid_remove()
            
    def show_version_info(self):
        message = "************************\n"
        message += "Version: 1.00\n"
        message += "************************"
        messagebox.showinfo("info", message)

                       
def main():
    hauptfenster = tk.Tk()
    hauptfenster.title(APP_TITLE)
    hauptfenster.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    hauptfenster.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = MeineAnwendung(hauptfenster)
    
    hauptfenster.mainloop()
 
 
if __name__ == '__main__':
    main()      
Dies ist mein Variante. Sicher nicht die beste. Es gibt noch viele andere. Viel Spass beim Studium.
Gruss wuf :-)
Take it easy Mates!
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hall Wuf,

hat bei mir leider nicht funktioniert.
Außerdem musste ich folgende Zeile anpassen:

Code: Alles auswählen

 self.logo = PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
zu

Code: Alles auswählen

 self.logo = tk.PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
das Bild ist immer noch im Hauptbildschirm und im Bildschirm von "Programm1" zu erkennen
Sollte aber nur auf dem Hauptbildschirm sein

Liegt es vielleicht an mir?

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import os
import tkinter as tk
from tkinter import messagebox

APP_TITLE = "Hauptfenster"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200


class MeineAnwendung(object):

    def __init__(self, hauptfenster):
        self.hauptfenster = hauptfenster
        self.menu(hauptfenster)

        self.entry_01 = tk.StringVar()
        self.entry_02 = tk.StringVar()
        
        self.enbbeded_frame = self.create_embbeded_frame(hauptfenster)
        self.hide_embbeded_frame()
        
        self.create_picture(hauptfenster)
        
    def menu(self, hauptfenster):
        menubar = tk.Menu(hauptfenster, bg='gray70') #bg="#000000")
        
        # Erstelle das Skripte
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(
            label="Programm 1", command=self.show_embedded_frame)
        filemenu.add_separator()
        filemenu.add_command(
            label="Exit", command=hauptfenster.quit)
        menubar.add_cascade(
            label="Skripte", menu=filemenu)
        
        # Erstelle das Help
        editmenu = tk.Menu(menubar, tearoff=0)
        editmenu.add_separator()
        helpmenu = tk.Menu(menubar, tearoff=0)
        helpmenu.add_command(label="About...", command=self.show_version_info)
        menubar.add_cascade(label="Help", menu=helpmenu)
        
        hauptfenster.config(menu=menubar)
    
    def create_embbeded_frame(self, hauptfenster):
        frame = tk.Frame(hauptfenster)
        frame.grid(row=0, column=0)
                
        tk.Entry(frame, textvariable=self.entry_01).grid(row=0, column=1)
        tk.Entry(frame, textvariable=self.entry_02).grid(row=1, column=1)
        
        tk.Label(frame, text="Eingabe1").grid(row=0)
        tk.Label(frame, text="Eingabe2").grid(row=1)
         
        tk.Label(frame, text="Standard", bg="#ffffbb", pady=10
            ).grid (row=3, columnspan=2, sticky='we')

        tk.Button(frame, text="Schliessen", command=self.hide_embbeded_frame
            ).grid(row=4, columnspan=2)    
        return frame
    
    def create_picture(self, hauptfenster):
        self.logo = PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
        tk.Label(hauptfenster, image=self.logo).grid(row=2,column=0)
            
    def show_embedded_frame(self):
        self.enbbeded_frame.grid()
    
    def hide_embbeded_frame(self):
        self.enbbeded_frame.grid_remove()
            
    def show_version_info(self):
        message = "************************\n"
        message += "Version: 1.00\n"
        message += "************************"
        messagebox.showinfo("info", message)

                       
def main():
    hauptfenster = tk.Tk()
    hauptfenster.title(APP_TITLE)
    hauptfenster.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    hauptfenster.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = MeineAnwendung(hauptfenster)
    
    hauptfenster.mainloop()
 
 
if __name__ == '__main__':
    main()      
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi erdmulch
hat bei mir leider nicht funktioniert.
Außerdem musste ich folgende Zeile anpassen:

Code: Alles auswählen

self.logo = PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
Stimmt. Für meinen lokalen Versuch konnte ich ja deinen Bildpfad nicht verwenden. Beim Einkommentieren habe ich das tk. vergessen.

Im folgende Skript werden die drei grafischen Objekte in verschiedenen Farben oder farbigen Rahmen angezeigt. Bitte sage mir welche Farbe ist das Hauptfenster, eingebettetes Fenster und das Bild:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import os
import tkinter as tk
from tkinter import messagebox

APP_TITLE = "Hauptfenster"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200


class MeineAnwendung(object):

    def __init__(self, hauptfenster):
        self.hauptfenster = hauptfenster
        self.menu(hauptfenster)

        self.entry_01 = tk.StringVar()
        self.entry_02 = tk.StringVar()
        
        self.enbbeded_frame = self.create_embbeded_frame(hauptfenster)
        #self.hide_embbeded_frame()
        self.show_embedded_frame()
        
        self.create_picture(hauptfenster)
        
    def menu(self, hauptfenster):
        menubar = tk.Menu(hauptfenster, bg='gray70') #bg="#000000")
        
        # Erstelle das Skripte
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(
            label="Programm 1", command=self.show_embedded_frame)
        filemenu.add_separator()
        filemenu.add_command(
            label="Exit", command=hauptfenster.quit)
        menubar.add_cascade(
            label="Skripte", menu=filemenu)
        
        # Erstelle das Help
        editmenu = tk.Menu(menubar, tearoff=0)
        editmenu.add_separator()
        helpmenu = tk.Menu(menubar, tearoff=0)
        helpmenu.add_command(label="About...", command=self.show_version_info)
        menubar.add_cascade(label="Help", menu=helpmenu)
        
        hauptfenster.config(menu=menubar)
    
    def create_embbeded_frame(self, hauptfenster):
        #frame = tk.Frame(hauptfenster)
        frame = tk.Frame(hauptfenster, bg='green', padx=10, pady=10)
        frame.grid(row=0, column=0, padx=10, pady=10)
                
        tk.Entry(frame, textvariable=self.entry_01).grid(row=0, column=1)
        tk.Entry(frame, textvariable=self.entry_02).grid(row=1, column=1)
        
        tk.Label(frame, text="Eingabe1").grid(row=0)
        tk.Label(frame, text="Eingabe2").grid(row=1)
         
        tk.Label(frame, text="Standard", bg="#ffffbb", pady=10
            ).grid (row=3, columnspan=2, sticky='we')

        tk.Button(frame, text="Schliessen", command=self.hide_embbeded_frame
            ).grid(row=4, columnspan=2)    
        return frame
    
    def create_picture(self, hauptfenster):
        self.logo = tk.PhotoImage(file="C:/E/scripts/E_scripts/media/Loading.gif")
        #self.logo = tk.PhotoImage(file="Loading.gif")
        #tk.Label(hauptfenster, image=self.logo).grid(row=2,column=0)
        tk.Label(hauptfenster, image=self.logo, bg='yellow',
            ).grid(row=2,column=0, pady=10, ipadx=10, ipady=10)
            
    def show_embedded_frame(self):
        self.enbbeded_frame.grid()
    
    def hide_embbeded_frame(self):
        self.enbbeded_frame.grid_remove()
            
    def show_version_info(self):
        message = "************************\n"
        message += "Version: 1.00\n"
        message += "************************"
        messagebox.showinfo("info", message)

                       
def main():
    hauptfenster = tk.Tk()
    hauptfenster.title(APP_TITLE)
    #hauptfenster.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #hauptfenster.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    hauptfenster.config(bg='steelblue')
    app = MeineAnwendung(hauptfenster)
    
    hauptfenster.mainloop()
 
 
if __name__ == '__main__':
    main() 
Gruss wuf :-)
Take it easy Mates!
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo Wuf,

Das Hauptfenster ist in diesem Beispiel gelb
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi erdmulch

Als Antwort habe ich folgendes erwartet:
Hauptfenster = blau
Eingebettetes Fenster = grün
Bild = gelb

Das eingebettete Fenster(Frame, grün) ist oben im Hauptfenster(blau) platziert. Und das Bild(gelb) ist unterhalb und nicht innerhalb des eingebetteten Fensters(deine Fensterbezeichnung= Programm1?)platziert wie du behauptest. Ehrlich gesagt ich verstehe nicht was du mit deiner Anwendung genau erreichen willst. Somit kann ich dir leider nicht mehr weiterhelfen.

Gruss wuf :-)
Take it easy Mates!
Antworten