Problem mit 2 Fenster

Fragen zu Tkinter.
Antworten
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hallo Pythoner,

Ich wollte eigentlich sowas machen:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import Tkinter


class APP(Tkinter.Frame):
            
    def Window1(self, master=None):
        
        Tkinter.Frame.__init__(self, master)
        l =  Tkinter.Label(master)
        l.grid(row = 0)

        self.l0 = Tkinter.Label(self.master, text = "Filename:")
        self.l0.grid(row=1, column=1) 
        self.b0 = Tkinter.Button(self.master,text = "Select")   
        self.b0.grid(row=1, column=2)
        
        self.l1 = Tkinter.Label(self.master,text = "Title:")
        self.l1.grid(row=2, column=1)
        self.title = Tkinter.Entry(self.master)
        self.title.grid(row=2, column=2)
        
        self.b1 = Tkinter.Button(self.master, text = "Weiter >>",command = self.Window2)
        self.b1.grid(row=6, column=2)
        
        
    def Window2(self, master=None):
        master = self.master

        #self.Window1.destory()
        Tkinter.Frame.__init__(self, master)
        l =  Tkinter.Label(master)
        l.grid(row = 0)

        self.b1 = Tkinter.Button(master, text = "<< Zurueck")
        self.b1.grid(row=6, column=2)
        master.mainloop()
        
root = Tkinter.Tk()         
root.geometry("300x190")       
create = APP() 
create.Window1(root)
root.mainloop()
Das man zwischen 2 Fenstern hin und her Schalten kann,
aber das vorherige Fenster soll immer geschlossen werden.
Bloß das Funktioniert nicht, oben das ist nur ein Beispielcode nicht der Richtige, da ist aber das selbe Problen.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du beschreibst Dein Problem mal wieder nur unzureichend! Da Dir präzise Formulierung schwer fällt, wieso erstellst Du nicht einfach ein paar Screenshots von einem Mockup und zeigst uns, wie der Ablauf sein soll?

Suchst Du eine Art "Dialog"?

Ich kenn mich mit Tk nicht aus, bezweifel aber, dass man das "root"-Fenster schließen kann, ohne alle anderen zu beenden...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Also ich möchte es so machen,
Window1 soll zuerst kommen(geöffnet werden), da kommt der eine Inhalt rein, unten ist ein Weiter Button,
der dann das geöffnete Fenster schließen soll und dann Window2 öffnen soll.

Dazu kann auch nochmal das ganze umgekehrt kommen.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jtschoch hat geschrieben: Dazu kann auch nochmal das ganze umgekehrt kommen.
Wasn das für nen UI-Konzept? So etwas habe ich noch nie gesehen - vermutlich wird es deswegen kein fertiges Konzept dafür geben!

Generell gibt es "Dialoge", die zusätzlich zu einem Fenster geöffnet werden, um kleinere, separate Eingaben zu realisieren. Kennt wohl jeder Computernutzer von so ziemlich allen Programmen.

Dann gibt es noch "Wizzards", die eine spezielle Form von Dialogen darstellen, bei denen man sich Schritt für Schritt durchklicken muss, um sequentielle Angaben zu machen. Das kennt man z.B. aus Installationsprogrammen oder bei der Einrichtung eines Programmes (z.B. Email-Konto anlegen, neues Projekt in Eclipse, usw).

Was Du da machen willst, passt da nicht wirklich rein.

Vielleicht beschreibst Du doch mal genauer, was Deine Absicht ist? Evtl. kann man das Verhalten ja durch Dialoge / Wizzards nachbauen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ungeachtet dessen, wie die Funktionalitaet spaeter mal aussehen soll, schau dir Toplevel-Windows und 'iconify ' an:
http://www.tkdocs.com/tutorial/windows.html

...und 2 mal 'mainloop' ist auch einmal zuviel.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Ich möchte eigent. sowas wie bei einen Setup, wo man was Einstellt und auf weiter klickt und wieder was Angibt,
sowas meine ich.

Ich habe mir nämlich ein Modul geschrieben was eine HTML Seite erstellt,
da wollte ich noch was Extra über TKinter machen, wo man verschiedene Angaben machen kann.(z.B. Seitentitle,...)
Ich wollte aber nicht alles auf ein Fenster klatschen, sondern auf 2 verteilen, das meine ich.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Hyperion hat geschrieben:Dann gibt es noch "Wizzards", die eine spezielle Form von Dialogen darstellen, bei denen man sich Schritt für Schritt durchklicken muss, um sequentielle Angaben zu machen. Das kennt man z.B. aus Installationsprogrammen oder bei der Einrichtung eines Programmes (z.B. Email-Konto anlegen, neues Projekt in Eclipse, usw).
jtschoch hat geschrieben:Ich möchte eigent. sowas wie bei einen Setup, wo man was Einstellt und auf weiter klickt und wieder was Angibt,
sowas meine ich.
Du möchtest also einen Wizard erstellen.
jtschoch hat geschrieben:Ich habe mir nämlich ein Modul geschrieben was eine HTML Seite erstellt,
da wollte ich noch was Extra über TKinter machen, wo man verschiedene Angaben machen kann.(z.B. Seitentitle,...)
Ich wollte aber nicht alles auf ein Fenster klatschen, sondern auf 2 verteilen, das meine ich.
Ich kenne nur ein Programm, dass alle Informationen wie von dir beschrieben auf mehrere Fenster verteilt und das ist GIMP. Wie die Mehrheit hier wissen dürfte, ist GIMPs Bedienung grauenhaft, insbesondere wenn man Photoshop gewöhnt ist, wo man stattdessen einzelne "Widgets" frei arrangieren kann, die einem Fenster zugeordnet sind.

Wäre die wohl bessere Variante das Problem anzugehen. Bzw. ein Redesign. Es gibt genug Editoren da draußen, du wirst dich sicher von einem gut gestaltetem diesbezüglich inspirieren lassen können.
Zuletzt geändert von webspider am Sonntag 15. Januar 2012, 18:34, insgesamt 2-mal geändert.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

AH, Ja Danke ich kucke mir das gleich mal an!

EDIT: Gibt es mal irgendwo eine Seite wo das ordentlich Beschrieben ist?(Wizzards)
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jtschoch hat geschrieben: EDIT: Gibt es mal irgendwo eine Seite wo das ordentlich Beschrieben ist?(Wizzards)
http://lmgtfy.com/?q=ui+wizzard
http://lmgtfy.com/?q=gui+wizzard
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jtschoch
jtschoch hat geschrieben:Das man zwischen 2 Fenstern hin und her Schalten kann,
aber das vorherige Fenster soll immer geschlossen werden.
Bloß das Funktioniert nicht, oben das ist nur ein Beispielcode nicht der Richtige, da ist aber das selbe Problen.
Hier eine mögliche Variante aus meiner Spielzeugtruhe:

Code: Alles auswählen

import Tkinter as tk

class CreateToplevel(tk.Toplevel):
    
    windows =  list()
      
    def __init__(self, app_win, geometry, title):
               
        tk.Toplevel.__init__(self)
        self.geometry('%dx%d+%d+%d' % geometry)
        self.title(title)
        
        if CreateToplevel.windows == []:
            CreateToplevel.windows.append(self)
        else:
            CreateToplevel.windows.append(self)
            self.withdraw()
            
        button_frame = tk.Frame(self)
        button_frame.pack(side='bottom', fill='x')
        
        next_button = tk.Button(button_frame, text='Change-Window',
            command=self.swap_windows)
        next_button.pack(side='left', expand=True)
        
        close_app_button = tk.Button(button_frame, text='Close App',
            command=self.destroy_me)
        close_app_button.pack(side='left', expand=True)
            
    def destroy_me(self):
        
        app_win.destroy()
        
    def swap_windows(self):
        
        for window_obj in CreateToplevel.windows:
            if window_obj != self:
                window_obj.deiconify()
            else:
                window_obj.withdraw()
        
app_win = tk.Tk()
app_win.withdraw()

geometry = (300, 200, 10, 10)
windos_1 = CreateToplevel(
    app_win, geometry, 'Fenster-1')
    
geometry = (300, 200, 400, 10)
windos_2 = CreateToplevel(
    app_win, geometry, 'Fenster-2')
    
app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke genau so meinte ich das!

Aber wie kann ioch das jetzt mit dem unterschiedlichen Inhalt machen?
Und es soll an der gleichen Stelle bleiben.

------------------------------------------------------------------------------------------------------
Um euch das nochmal klar zu machen,
Ich will das so wie bei Eclipse, wo zuerst das Einstellungsfensterkommt (mit dem Path),
und dann das Hauptprogramm oder wie bei Thunderbird mit der Passwortabfrage.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

jtschoch hat geschrieben:Aber wie kann ioch das jetzt mit dem unterschiedlichen Inhalt machen?
Und es soll an der gleichen Stelle bleiben.
Ist sehr einfach:

Code: Alles auswählen

import Tkinter as tk

class CreateToplevel(tk.Toplevel):
    
    windows = list()
      
    def __init__(self, app_win, geometry, title):
               
        tk.Toplevel.__init__(self)
        self.geometry('%dx%d+%d+%d' % geometry)
        self.title(title)
        
        if CreateToplevel.windows == []:
            CreateToplevel.windows.append(self)
        else:
            CreateToplevel.windows.append(self)
            self.withdraw()
            
        button_frame = tk.Frame(self)
        button_frame.pack(side='bottom', fill='x')
        
        swap_button = tk.Button(button_frame, text='Swap Window',
            command=self.swap_windows)
        swap_button.pack(side='left', expand=True)
        
        close_app_button = tk.Button(button_frame, text='Close App',
            command=self.destroy_me)
        close_app_button.pack(side='left', expand=True)
            
    def destroy_me(self):
        
        app_win.destroy()
        
    def swap_windows(self):
        
        for window_obj in CreateToplevel.windows:
            if window_obj != self:
                window_obj.deiconify()
            else:
                window_obj.withdraw()
        
app_win = tk.Tk()
app_win.withdraw()

#--- Fenster-1 ----------------------------------------------------------------#
geometry = (300, 200, 10, 10)
window_1 = CreateToplevel(
    app_win, geometry, 'Fenster-1')

label_for_window_1 = tk.Label(window_1, text='Label-1', padx=5,
    font=('Helvetica', 30, 'bold'), fg='darkolivegreen', bd=4, relief='raised')
label_for_window_1.pack(expand=True)
#------------------------------------------------------------------------------#

#--- Fenster-2 ----------------------------------------------------------------#    
geometry = (300, 200, 10, 10)
window_2 = CreateToplevel(
    app_win, geometry, 'Fenster-2')

label_for_window_2 = tk.Label(window_2, text='Label-2', padx=5,
    font=('Helvetica', 30, 'bold'), fg='steelblue4', bd=4, relief='raised')
label_for_window_2.pack(expand=True)
#------------------------------------------------------------------------------#
    
app_win.mainloop()
Grß wuf :wink:
Take it easy Mates!
Antworten