about fenster die 2. ...

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

n'abend.

also, ich habe diese alte About Fenster problem, der erste thread zu finden unter:
http://python.sandtner.net/viewtopic.ph ... ad23fc1749

so, jetzt habe ich ein neues projekt angefangen, versucht den da geschriebenen code umzuschreiben, und es klapppt nicht:

about.py:

Code: Alles auswählen

"""
from Tkinter import *
import properties

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

class About(Toplevel):
    def __init__(self):
        #~~ initializing of a borderless Toplevel window
        Toplevel.__init__(self)
        # creates that window
        self.overrideredirect(TRUE)
        # showing modal:
        self.grab_set()

        
        self.about_window = Tk()
        self.about_window["bg"] = properties.window_color
        self.about_window.title("About...")

        self.text_frame = Frame(self.about_window, border=1, relief="raised")
        self.text_frame.grid(row=0,column=0)

        self.content_label = Label(self.text_frame, text = content, fg=properties.font_color, bg=properties.window_color)
        self.content_label.grid(row=1,column=0)
        
        self.ok_button = Button(self.about_window, text="OK",border=1, bg=properties.window_color, fg=properties.button_font_color, command = self.close)
        self.ok_button.grid(row=1,column=0)
        
    def close(self):
        self.about_window.destroy()
test.py (nur für diesen thread) :

Code: Alles auswählen

#! /usr/bin/python2.3

from Tkinter import *
from about import *


root = Tk()

button = Button(root, text="About", command = About)
button.grid(padx=10,pady=10)

root.mainloop()
ich kann das fenster mit dem "About" Button öffnen, nur danach lässt er sich nicht mehr anklicken. (unter suse 9.0)

wenn ich jetzt in about.py die zeile:

Code: Alles auswählen

self.overrideredirect(TRUE)
lösche, dann funktioniert der button, man kann so oft öffnen und schließen wie man will.
Allerdings kommt dabei ein neues Tkfenster (Tkinter.Tk).

wie kann ich das vermeiden.

der code auf
http://python.sandtner.net/viewtopic.ph ... ad23fc1749

hat gestimmt. was is dran falsch? und wie kann ich das ändern?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi DER Olf,

About ist eine Klasse und keine Funktion. Daher könnte das Problem kommen.
Übergib dem Button eine Funktion, die dann das Aboutfenster öffnet.


Gruß

Dookie
Gast

ich könnte genauso gut schreiben

Code: Alles auswählen

button = Button(root, text="About", command = About.__init__) 
ich habe ja keine weitere methode die das fenster anzeigt, da alles in der __init__ methode steht, und nur eine methode der klasse About zum schießen verwendet wird (und muss)
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

hallo?
ich bin bestimmt kein "kleinschreiber" mehr,
kann mir denn _keiner_ helfen? :cry:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo OLF

Antwort eines Gross- und kleinschreibers!

Dein About-Skript ist ein schlechte
Kopie von dem erwähnten Link:
http://python.sandtner.net

Warum rufst Du in Deiner About-Klasse
noch einmal Tk() auf? Weil in Deinem
Testskript wird Tk() ja schon initial-
isiert. Ich nehme an, dass in Deinem
Projekt die Aboutklasse von einem Skript
angefordert wird, dei dem Tk() schon
initialisiert wurde?

Deine About-Klasse erbt alle Aboutfenster
Attribute und und Methoden von der Tkinter
'Toplevel' Klasse, welche in der Deklaration
Deiner About-Klasse als Oberklasse angegeben
ist als:

-> class About(Toplevel):

Somit kannst Du die Attribute und Methoden
für Dein einfach mit self ansprechen.

Um die Hintergrundfarbe des Aboutfensters zu
setzen braucht es somit nicht mehr:
self.about_window['bg']

sondern nur noch:
self['bg']

Wie Dookie schon erwähnte kannst Du
eine Klasse nicht wie eine Funktion
aufrufen. Es funktionier bei Deinem
Beispiel zwar, habe es aber noch nie
in dieser Art gesehen. Vielleicht wissen
andere Forumbenützer mehr darüber? Normaler-
weise wird in einer Anwendung mit der
Instanz von einer Klasse gearbeitet.

Die Aufrufart des NoName Gastes mit
....command = About.__init__)

ergibt bei mir folgende Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.3/Q&A/Tkinter.py", line 1345, in __call__
return self.func(*args)
TypeError: unbound method __init__() must be called with About instance as first argument (got nothing instead)

Nebenbei:
Bei Grossschreibern ist auch das kleingeschriebene
wichtig!

Zum Beispiel was willst Du mit Deiner Anwendung
schlussendlich erreichen? Ist es nur Übung oder
für wirkliches Projekt gedacht. Ist es für ein
wirkliches Projekt, wäre noch einige Angaben,
nur in Stichworten, über die Anforderung hilfreich.

Noch ein Tipp:
Bei einer Session im Forum immer alle Module ,
solange sie nicht zu gross sind, mitliefern.
Zum Beispiel bei Deiner Anwendung das Modul für
die properies. Pythonskripte sind ja nur Textskripte
und sollten den Forum-Server nicht aufblähen Hi!
Ich bin normalerweise schreibfaul, wenn es um
fremde Anwendungen geht. Das hier ist eine Ausnahme!

Nun folgt noch Programmkode den Du ausprobiern kannst.
Es gibt sicher noch 100 andere Lösungen:

Hauptskript:

Code: Alles auswählen

#! /usr/bin/python2.3

from Tkinter import *
from About import *

def about_dialog():
	dialog = About()

root = Tk()

button = Button(root, text="About", command = about_dialog)
button.grid(padx=10,pady=10)

root.mainloop()
About-Klasse:

Code: Alles auswählen

from Tkinter import *
import properties

content = 'Hallo'

class About(Toplevel):
	def __init__(self):
		# initializing of a borderless Toplevel window
		Toplevel.__init__(self)

		# Set the position and dimensions of the dialog-window
		self.geometry("%dx%d+%d+%d" % (200,200,20,20))

		# Properties of the dialog-window
		self["bg"]     = properties.window_color
		self['border'] = 2
		self['relief'] = RAISED
		self.title("About...")

		# creates a frameless dialog-window
		self.overrideredirect(TRUE)

		# showing modal:
		self.grab_set()

		self.text_frame = Frame(self, border=1, relief="raised")
		self.text_frame.grid(row=0,column=0)

		self.content_label = Label(self.text_frame,
								   text = content,
								   fg=properties.font_color,
								   bg=properties.window_color)
		self.content_label.grid(row=1,column=0)

		self.ok_button = Button(self,
								text="OK",
								border=1,
								bg=properties.window_color,
								fg=properties.button_font_color,
								command = self.close)
		self.ok_button.grid(row=1,column=0)

	def close(self):
		self.destroy()
Eigenschaften:

Code: Alles auswählen

font_color        = 'yellow'
window_color      = 'steelblue'
button_font_color = 'lightsteelblue'
Gruss von Grossschreiber wuf :wink:
Take it easy Mates!
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

achso achso, kkkkkkkkkkkk.
danke danke, vielen danke. das hab ich nicht gewusst, und da wär ich bestimmt nicht von selbst drauf gekommen...

ich hab einfach entfernt und

Code: Alles auswählen

self.window
durch ersetze.

bis denne

Olf
Antworten