Seite 1 von 1
neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 10:13
von erdmulch
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()
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 11:52
von wuf
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

Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 12:17
von erdmulch
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
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 12:46
von wuf
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

Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 12:57
von __blackjack__
@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.
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 16:25
von erdmulch
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()
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 16:38
von __blackjack__
@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.
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 16:46
von erdmulch
stimmt. aber kann ich es dennoch igendwie ausblenden?
Im Moment sehe ich keine Möglichkeit...
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Samstag 3. November 2018, 21:28
von wuf
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

Re: neues Fenster im Hauptfenster einbinden
Verfasst: Sonntag 4. November 2018, 09:50
von erdmulch
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()
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Sonntag 4. November 2018, 11:25
von wuf
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

Re: neues Fenster im Hauptfenster einbinden
Verfasst: Sonntag 4. November 2018, 17:21
von erdmulch
Hallo Wuf,
Das Hauptfenster ist in diesem Beispiel gelb
Re: neues Fenster im Hauptfenster einbinden
Verfasst: Sonntag 4. November 2018, 18:04
von wuf
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
