[Tkinter] Childwindow

Fragen zu Tkinter.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

[Tkinter] Childwindow

Beitragvon C4S3 » Montag 22. Januar 2007, 08:30

Guten Tag alle zusammen!

Ich hänge gerade bei einem Script und hoffe, dass mir jemand einen Tip (also eigentlich sind es zwei Tips) geben kann.
Es geht dabei um ein Childwindow in Tkinter.

1) Childwindow öffnen, parent wartet:
Es ist kein Problem, das Childwindow zu öffnen. Nur wäre es "schöner", wenn das Parent in dieser Zeit nicht aktivierbar wäre. Daher: das Parent soll erst wieder den Focus erhalten können und aktiv sein, wenn das Child nicht mehr geöffnet ist.

2) Childwindow schließen:
Klar kann ich das Childwindow mit dem X schließen, aber ein "Exit"-Button wäre schon toll. Ich habe dazu child.destroy() verwendet, aber das scheint nicht zu funktionieren. Ich bekomme eine Fehlermeldung, dass die maximale Anzahl an Argumenten erreicht ist. :shock:

Es ist ja nicht so, dass das Programm ohne diese Funktionen nicht arbeiten würde, aber es wäre doch schöner. Zum Einen würde die Funktionalität verbessert, zum Anderen würde ich was lernen.

Hier ist mal der bisherige Source:

Code: Alles auswählen

#!/usr/bin/python

import Tkinter as t
import sys as s

class Window(object, t.Tk):
    """A simple Parent window with all the buttons
    needed for the App"""

    def __init__(self):
        self.root = t.Tk()

        self.label = t.Label(self.root,
            pady=5,
            text="Tealist").grid(row=1, column=1)

        self.list = t.Listbox(self.root,
            width=40,
            height=13).grid(row=2, column=1, rowspan=4)
       
        self.btn_start = t.Button(self.root,
            width=8,
            bg="green",
            text="Start",
            command=self.brew).grid(row=2, column=2, sticky=t.E)
      
        self.btn_stop = t.Button(self.root,
            width=8,
            bg="red",
            text="Stop",
            command=self.stop).grid(row=3, column=2, sticky=t.E)
      
        self.btn_config = t.Button(self.root,
            width=8,
            fg="white",
            bg="blue",
            text="Config",
            command=self.cfg).grid(row=4, column=2, sticky=t.E)

        self.btn_exit = t.Button(self.root,
            width=8,
            text="Exit",
            command=self.leave).grid(row=5, column=2, sticky=t.E)

        self.root.mainloop()


    def brew(self):
        """this will be the timer function"""
        pass

    def stop(self):
        """Stop the timer"""
        pass

    def cfg(self):
        """Open the window with the config"""
        config = ChildWin(self.root)
      #config.ChildWin.wait_window() # found on the web, but doesn't work

    def leave(self):
        """Wow, extit the app"""
        s.exit(0)

class ChildWin(object, t.Tk):
   """Childwindow, showing the config"""

   def __init__(self, parent):
      self.root = t.Toplevel(parent)
      self.btn_add = t.Button(self.root,
            text="Add",
            command=self.add).grid(row=1, column=1, sticky=t.W)
      
      self.btn_delete = t.Button(self.root,
            text="Delete",
            command=self.delete).grid(row=1, column=2, sticky=t.W)
      
      self.btn_closechild = t.Button(self.root,
            text="Close",
            command=self.close).grid(row=1, column=4, sticky=t.E)
      
      self.lbl_name = t.Label(self.root,
            text="Tea:").grid(row=2, column=1, sticky=t.E)
      
      self.entry_tea = t.Entry(self.root,
            width=30,
            bg="white").grid(row=2, column=2, sticky=t.W)
      
      self.lbl_time = t.Label(self.root,
            text="Time:").grid(row=2, column=3, sticky=t.E)
      
      self.entry_time= t.Entry(self.root,
            width=10,
            bg="white").grid(row=2, column=4, sticky=t.W)
      
      self.tealist = t.Listbox(self.root,
            bg="white").grid(row=3, column=1, columnspan=5, sticky=t.W+t.E+t.N+t.S)

      self.root.mainloop()

   def add(self):
      pass

   def delete(self):
      pass

   def close(self):
      self.destroy()   # found on the web, but doesn't work!


root = Window()


Dankeschön schon mal!
Gruß!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Montag 22. Januar 2007, 09:54

Hi,
schaumal ob es das ist, was du wolltest.

Code: Alles auswählen

#!/usr/bin/python

import Tkinter as t
import sys as s

class Window(t.Frame):
   #t.Tk von Tk sollte man nach moegligkeit nicht oder nur einmal ableiten! ganz wichtig
   """A simple Parent window with all the buttons
   needed for the App"""

   def __init__(self, master):
      t.Frame.__init__(self, master)
      self.root = master

      self.label = t.Label(self.root,
         pady=5,
         text="Tealist").grid(row=1, column=1)

      self.list = t.Listbox(self.root,
         width=40,
         height=13).grid(row=2, column=1, rowspan=4)
   
      self.btn_start = t.Button(self.root,
         width=8,
         bg="green",
         text="Start",
         command=self.brew).grid(row=2, column=2, sticky=t.E)
   
      self.btn_stop = t.Button(self.root,
         width=8,
         bg="red",
         text="Stop",
         command=self.stop).grid(row=3, column=2, sticky=t.E)
   
      self.btn_config = t.Button(self.root,
         width=8,
         fg="white",
         bg="blue",
         text="Config",
         command=self.cfg).grid(row=4, column=2, sticky=t.E)

      self.btn_exit = t.Button(self.root,
         width=8,
         text="Exit",
         command=self.leave).grid(row=5, column=2, sticky=t.E)

      #~ self.root.mainloop()


   def brew(self):
      """this will be the timer function"""
      pass

   def stop(self):
      """Stop the timer"""
      pass

   def cfg(self):
      """Open the window with the config"""
      config = ChildWin(self.root)
      #config.ChildWin.wait_window() # found on the web, but doesn't work

   def leave(self):
      """Wow, extit the app"""
      s.exit(0)

class ChildWin(t.Frame):
   #t.Tk von Tk sollte man nach moegligkeit nicht oder nur einmal ableiten! ganz wichtig
   
   """Childwindow, showing the config"""

   def __init__(self, parent):
      t.Frame.__init__(self, parent)
      self.root = t.Toplevel(parent)
         
      self.btn_add = t.Button(self.root,
         text="Add",
         command=self.add).grid(row=1, column=1, sticky=t.W)
   
      self.btn_delete = t.Button(self.root,
         text="Delete",
         command=self.delete).grid(row=1, column=2, sticky=t.W)
   
      self.btn_closechild = t.Button(self.root,
         text="Close",
         command=self.close).grid(row=1, column=4, sticky=t.E)
   
      self.lbl_name = t.Label(self.root,
         text="Tea:").grid(row=2, column=1, sticky=t.E)
   
      self.entry_tea = t.Entry(self.root,
         width=30,
         bg="white").grid(row=2, column=2, sticky=t.W)
   
      self.lbl_time = t.Label(self.root,
         text="Time:").grid(row=2, column=3, sticky=t.E)
   
      self.entry_time= t.Entry(self.root,
         width=10,
         bg="white").grid(row=2, column=4, sticky=t.W)
   
      self.tealist = t.Listbox(self.root,
         bg="white").grid(row=3, column=1, columnspan=5, sticky=t.W+t.E+t.N+t.S)

   
      self.root.focus_set()
      self.root.grab_set()
      self.root.wait_window()

   def add(self):
      pass

   def delete(self):
      pass
   
   def close(self):
      self.root.destroy()    #ist doch sehr einfach :-)
   
   

def _Main():
   root = t.Tk()
   app = Window(root)
   root.mainloop()
   
if __name__=='__main__':
   _Main()



Gruss
pyStyler
Zuletzt geändert von pyStyler am Dienstag 23. Januar 2007, 15:57, insgesamt 1-mal geändert.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Montag 22. Januar 2007, 10:05

Danke.
Ja, das ist, was ich wollte. Ich muss mich da jetzt aber noch informieren, warum das alles so ist.
Ich grabe es mal durch und komme dann wieder (mit neuen Fragen ^^).

Thx.
Gruß!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Montag 22. Januar 2007, 10:09

C4S3 hat geschrieben:Danke.
Ja, das ist, was ich wollte. Ich muss mich da jetzt aber noch informieren, warum das alles so ist.
Ich grabe es mal durch und komme dann wieder (mit neuen Fragen ^^).

Thx.


ok mach das :)
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Montag 22. Januar 2007, 12:47

Hi C4S3,
noch etwas.
Bei der Klasse ChildWin kannst du auch direkt von Toplevel ableiten.

Code: Alles auswählen

class ChildWin(t.Toplevel):

   def __init__(self, parent):
      t.Toplevel.__init__(self)
      
      self.root = (self )
                 #................
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Dienstag 23. Januar 2007, 08:37

Danke noch mal.
Ehrlich gesagt ist mir das noch ein wenig zu hoch.
(Das ist schwieriger als ich dachte)

Gibt es vielleicht irgendwo eine Art "grafische Tafel", auf der man die "Verzweigungen" von Tkinter sehen kann?
Es ist ganz schön schwierig, sich als Grünschnabel duch den Wald aus Modulen, Klassen, Hierarchien, .. zu kämpfen.

Danke.
Gruß!
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Beitragvon Andy » Donnerstag 25. Januar 2007, 20:30

Gibt es vielleicht irgendwo eine Art "grafische Tafel", auf der man die "Verzweigungen" von Tkinter sehen kann?


Nein aber ein Buch! :lol:

War nur ein Scherz. Bei Tkinter ist http://www.pythonware.com/library/tkinter/introduction/index.htm
und http://effbot.org/tkinterbook/

immer die erste Wahl. Wobei ersteres das letztere nur übersichtlicher darstellen soll. Beide sind vom selben Verfasser.

Gruss
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Donnerstag 25. Januar 2007, 23:18

Danke, effbot kenn ich!
Gruß!
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Sonntag 28. Januar 2007, 22:51

Ich hatte nun endlich mal etwas Zeit, um mir den Code genau anzusehen. Jetzt beginne ich zumindest zu verstehen, warum das so gelöst wurde, was sich mir auf den ersten Blick absolut nicht erschliessen wollte.

Ich muss das noch wirklich lernen, damit ich es aus dem Effeff beherrsche. Danke nochmals.

:D
Gruß!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder