probleme mit einem about fenster...

Fragen zu Tkinter.
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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?? :(
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi DER Olf,

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


Gruß

Dookie
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

hmm....dann passiert gor nix mehr... :?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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)


Take it easy Mates!
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi DER OLF

Was ist dein Problem genau?

wuf
Take it easy Mates!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi wuf,

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


Gruß

Dookie
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Also nochmal,
show = deiconify
hide = withdraw


Gruß

Dookie
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

ja, aber die parameter :roll:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

welche Parameter?

Code: Alles auswählen

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

Gruß

Dookie
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

AttributeError: Tk instance has no attribute 'widthdraw'

und das fenster öffnet sich auf gleich beim starten der haupt datei.
:? :? :?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

welche Version von TK und Python verwendest Du?
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

2.3.2 (active python),
ich glaube da is tcl/tk 8.4 (kann mich auch irren mit der version) dabei
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Antworten