[Tkinter] Childwindow

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

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

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

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

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

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

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....

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/tkint ... /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

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

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ß!
Antworten