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

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

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