Seite 1 von 2

probleme mit einem about fenster...

Verfasst: Donnerstag 15. Januar 2004, 20:21
von DER Olf
hi!
ich habe ein problem das ich auch bei "akkgemein" hätte posten können:

ich habe eine datei "about.py"

Code: Alles auswählen

#! Python
# -*- coding: iso-8859-1 -*-

# about.py

from Tkinter import *

def ende():
    fenster.destroy()

fenster = Tk()
fenster.title('About...')

content = """
bla
bla
bla
...
...
...
"""

text_label = Label(fenster, text = content)
text_label.pack()

ende_button = Button(fenster, text = "OK", command = ende)
ende_button["height"] = 1
ende_button["width"] = 12
ende_button["border"] = 3
ende_button.pack()

diese datei wird in der hauptdatei import.

allerdings in einer funktion.

d.h. in der hauptdatei ist ein button(command = info) und die funktion dafür sieht so aus:

Code: Alles auswählen

def info():
      import about
      about.fenster.mainloop()

wenn ich nun die datei öffne und auf den about button klicke funktioniert alles wunderbar, das about fenster öffnet sich.

wenn ich es jedoch schließe (OK Button, funktion:  fenster.destroy() )
und dann nochmal auf den about button klicke passiert gar nix!
ich muss das programm zuert wieder schließen. :? 

wie kann ich das beheben?

Danke schonmal jetzt

DER Olf

Verfasst: Donnerstag 15. Januar 2004, 21:41
von hans
Kenne zwar TKInter nicht aber ich glaub ich hab die Lösung.

mit fenster = TK() erzeugst du ein neues Fenster, welches du mit fenster.show(), oder wie auch immer, angezeigst bekommst. Beim Schließen darfst du das Fenster aber nicht zestören (.....destroy) sondern nur unsichtbar machen. In Delphi gibt's da die Methoden show() und hide(). Ich kann mir vorstellen, dass es in TKInter ähnlich ist.

Hans

Verfasst: Freitag 16. Januar 2004, 10:46
von DER Olf
ich hab in der Pythonwin hilfe hide_form() und show_form( placement, bordertype, name) gefunden.

jedoch funktioniert beides nicht. show_form hat keine weiteren parameter, aber wenn ichdas programm starte bekomme ich diese fehlermeldung:

global name 'show_form' is not defined

kann mir jemand was genaueres sagen?? :(

Verfasst: Freitag 16. Januar 2004, 14:19
von Dookie
Hi DER Olf,

versuchs mal mit window.withdraw() und window.deiconify(), siehe auch TKinter Window Visibility Methods


Gruß

Dookie

Verfasst: Freitag 16. Januar 2004, 14:27
von DER Olf
hmm....dann passiert gor nix mehr... :?

Verfasst: Freitag 16. Januar 2004, 23:40
von wuf
Hi OLF

Hier eine mögliche Lösung für deine About-
Anwendung. Eventuell habe ich deine Frage
falsch interpretiert? Es gibt vielleicht
noch einfachere Lösungen für diese Aufgabe.
Übrigens dein """bla bla ...""" Text lässt
sich nicht zentrieren. Ich weiss nicht wieso?

Gruss wuf

Code: Alles auswählen

#! Python
# -*- coding: UTF-8 -*-

# Hauptscript

from Tkinter import *
from About   import *

def ende():
	fenster.destroy()

def info():
	About(content)

if __name__ == '__main__':
	fenster = Tk()

	ScreenWidth  = fenster.winfo_screenwidth()
	ScreenHeight = fenster.winfo_screenheight()

	xpos   = 0
	ypos   = 0
	width  = 300
	height = 100
	fenster.wm_geometry("%dx%d+%d+%d" % (width,height,xpos,ypos))

	fenster.title('Hauptfenster')

	content =  "bla\nbla\nbla\n...\n"
	content += "Here comes DER OLF\n"
	content += "the camel hunter!"

	cancel_button = Button(fenster, text = "Schliessen", command = ende)
	cancel_button["height"] = 1
	cancel_button["width"] = 12
	cancel_button["border"] = 3
	cancel_button.pack(side=BOTTOM)

	Info_button = Button(fenster, text = "About", command = info)
	Info_button["height"] = 1
	Info_button["width"] = 12
	Info_button["border"] = 3
	Info_button.pack(side=BOTTOM)

	fenster.mainloop()

from Tkinter import *
class About(Toplevel):
	def __init__(me,meldung='About'):

		#~~ Initialisierung eines Rahmenlosen Toplevelfenster
		Toplevel.__init__(me)
		# Erzeugt Rahmenloses Fenster
		me.overrideredirect(TRUE)
		# Sperrt Schaltflächen auf dem Hauptfenster
		me.grab_set()

		# Berechnung für ein Bildschirmzentriertes About-Fenster
		width        = 250
		height       = 150
		ScreenWidth  = me.winfo_screenwidth()
		ScreenHeight = me.winfo_screenheight()
		xpos         = (ScreenWidth-width)/2
		ypos         = (ScreenHeight-height)/2

		me.geometry("%dx%d+%d+%d" % (width,height,xpos,ypos))
		me.title ('About..')

		me['bg']     = 'steelblue'
		me['bd']     = 3
		me['relief'] = RAISED

		aboutlbl = Label(me,anchor="center", text= meldung,bg=me['bg'],fg="yellow")
		aboutlbl.pack(padx=5,pady=5)

		ok_button = Button(me, text = "OK",
						   highlightbackground = me['bg'],
						   command = me.destroy
						   )
		ok_button.pack(padx=5,pady=5)



Verfasst: Sonntag 18. Januar 2004, 00:02
von DER Olf
jetzt öffnet sich beim starten das fenster.
dann schließ ichs und ich hab wieder das gleiche problem. :?

ich denke dass der ansatz von hans nicht ganz verkehrt war.
habt ihr eine lösung für die show / hide sache?

Verfasst: Sonntag 18. Januar 2004, 22:35
von wuf
Hi DER OLF

Was ist dein Problem genau?

wuf

Verfasst: Montag 19. Januar 2004, 01:46
von Dookie
Hi wuf,

du hättest die beiden scripte vielleicht besser trennen sollen.


Gruß

Dookie

Verfasst: Montag 19. Januar 2004, 12:40
von DER Olf
hhmm...
ich komm da von allein nich drauf, und bei suchmaschinen hab ich die suche nach Tkinter auch aufgegeben... :?

habt ihr ne lösung im bezug auf show/hide?

Verfasst: Montag 19. Januar 2004, 13:32
von Dookie
Also nochmal,
show = deiconify
hide = withdraw


Gruß

Dookie

Verfasst: Montag 19. Januar 2004, 13:43
von DER Olf
ja, aber die parameter :roll:

Verfasst: Montag 19. Januar 2004, 16:45
von Dookie
welche Parameter?

Code: Alles auswählen

>>> from Tkinter import *
>>> fenster = TK()
>>> fenster.withdraw()
>>> fenster.deiconify()

Gruß

Dookie

Verfasst: Montag 19. Januar 2004, 17:09
von DER Olf
AttributeError: Tk instance has no attribute 'widthdraw'

und das fenster öffnet sich auf gleich beim starten der haupt datei.
:? :? :?

Verfasst: Montag 19. Januar 2004, 18:59
von Dookie
welche Version von TK und Python verwendest Du?

Verfasst: Montag 19. Januar 2004, 19:07
von DER Olf
2.3.2 (active python),
ich glaube da is tcl/tk 8.4 (kann mich auch irren mit der version) dabei

Verfasst: Montag 19. Januar 2004, 21:22
von Dookie
hmm komisch hab ich auch. Warum packst Du das ganze nicht in eine Funktion, die dann das Aboutfenster aumacht und beim druck auf ok schließt?
Und die Funktion importierst aus dem Modul.

Gruß

Dookie

Verfasst: Montag 19. Januar 2004, 23:09
von wuf
Hallo OLF & Dookie

Es ist schon so, dass mein Script
eigendlich aus zwei besteht, ich
hätte diese separat auflisten müssen.
Ich muss noch ein wenig mit dem Forum-
Editor üben um eine bessere Darstellung
hinzukriegen.
Mein Vorschlag besteht aus einem Haupt-
script und dem About-Script.

Gruss wuf

Verfasst: Dienstag 20. Januar 2004, 12:31
von DER Olf
also würdest du die klasse in eine seperate datei (bei mir about.py) schreiben?
ich weiß was du meinst, aber ich komme mir deinem post, in dem der ganze code (als eine datei) steht nicht ganz klar :oops:

Verfasst: Dienstag 20. Januar 2004, 14:48
von Dookie
Ich zerleg mal den Code von wuf

Hauptscript

Code: Alles auswählen

#! Python
# -*- coding: UTF-8 -*-

# Hauptscript

from Tkinter import *
from About   import *

def ende():
   fenster.destroy()

def info():
   About(content)

if __name__ == '__main__':
   fenster = Tk()

   ScreenWidth  = fenster.winfo_screenwidth()
   ScreenHeight = fenster.winfo_screenheight()

   xpos   = 0
   ypos   = 0
   width  = 300
   height = 100
   fenster.wm_geometry("%dx%d+%d+%d" % (width,height,xpos,ypos))

   fenster.title('Hauptfenster')

   content =  "bla\nbla\nbla\n...\n"
   content += "Here comes DER OLF\n"
   content += "the camel hunter!"

   cancel_button = Button(fenster, text = "Schliessen", command = ende)
   cancel_button["height"] = 1
   cancel_button["width"] = 12
   cancel_button["border"] = 3
   cancel_button.pack(side=BOTTOM)

   Info_button = Button(fenster, text = "About", command = info)
   Info_button["height"] = 1
   Info_button["width"] = 12
   Info_button["border"] = 3
   Info_button.pack(side=BOTTOM)

   fenster.mainloop()
Aboutscript, wird vom Hauptscript importiert

Code: Alles auswählen

from Tkinter import *
class About(Toplevel):
   def __init__(me,meldung='About'):

      #~~ Initialisierung eines Rahmenlosen Toplevelfenster
      Toplevel.__init__(me)
      # Erzeugt Rahmenloses Fenster
      me.overrideredirect(TRUE)
      # Sperrt Schaltflächen auf dem Hauptfenster
      me.grab_set()

      # Berechnung für ein Bildschirmzentriertes About-Fenster
      width        = 250
      height       = 150
      ScreenWidth  = me.winfo_screenwidth()
      ScreenHeight = me.winfo_screenheight()
      xpos         = (ScreenWidth-width)/2
      ypos         = (ScreenHeight-height)/2

      me.geometry("%dx%d+%d+%d" % (width,height,xpos,ypos))
      me.title ('About..')

      me['bg']     = 'steelblue'
      me['bd']     = 3
      me['relief'] = RAISED

      aboutlbl = Label(me,anchor="center", text= meldung,bg=me['bg'],fg="yellow")
      aboutlbl.pack(padx=5,pady=5)

      ok_button = Button(me, text = "OK",
                     highlightbackground = me['bg'],
                     command = me.destroy
                     )
      ok_button.pack(padx=5,pady=5) 
eventuell solltest me im Aboutscript noch durch self ersetzen. Lauffen tuts auch so, aber in Python verwendet man self bei Methoden als erstes Argument.


Gruß

Dookie