Seite 1 von 1

MessageBox

Verfasst: Freitag 6. Oktober 2006, 16:00
von prof_weirdo
Hallo,

ich war mir nicht sicher in welches Forum, vermute aber das es hier passt.

Also, ich arbeite unter WinXP und habe ein Programm das Tkinter nutzt um ein Fenster zu erzeugen. Dort kann man Begriffe eingeben die in einer Liste eingetragen werden.



Folgendes Problem:

Ich möchte das wenn der User das Fenster oben in der Ecke mit dem Standard Fensterkreuz wegclickt, eine Messagebox erscheint mit der Abfrage ob der User die eben eingegebenen Daten dauerhaft speichern oder verwerfen möchte. Über Tkinter geht das ja anscheinend nicht. Ich dachte da an die WinAPI, wurde da aber noch nicht fündig, oder liege ich komplett falsch ?

Schonmal danke für alle erhellenden Kommentare :D

Verfasst: Freitag 6. Oktober 2006, 16:27
von murph
das geht sehr wohl mit tkinter, wie auch mit (fast?) jedem anderen gui-toolkit.
tut mir leid, dass ich nicht sagen kann, wie man das schreibt,
aber von der winAPI kannst du getrost die hände lassen ;-)

Verfasst: Freitag 6. Oktober 2006, 17:00
von prof_weirdo
Ok.

Also das es MessageBoxes bei Tkinter gibt wusste ich eigentlich auch schon. Hab mich wohl mal wieder unpräzise ausgedrückt.

Mir ist nicht so ganz klar wie ich ich das aufrufen einer Messagebox mit dem schliessen des Fensters über das Kreuz koppeln kann.

Hmm... also ansonsten fallen mir da noch Events ein, aber kann da nichts passendes finden :(

Verfasst: Freitag 6. Oktober 2006, 17:24
von pyStyler
Hi,

versuch mal damit etwas anzufangen.

Code: Alles auswählen

from Tkinter import *
class Demo:
	def __init__( self, master):
		self.master=master
		self.master.geometry('200x200')
		Button(self.master, text='Ok',
			command=self.ok).pack(expand=YES, fill=BOTH)
			
		
		self.master.protocol('WM_DELETE_WINDOW',
				self.frage_datei_speichern)
		self.master.mainloop()
		
	def ok( self ):
		print 'OK.....'
		
	def frage_datei_speichern( self ):
		self.dialog = Ausgang(self.master)
		self.returnValue = self.dialog.showMessage('frage',
				'Daten vorher speichern')
		if self.returnValue:
			self.master.destroy()
class Ausgang:
	def __init__( self, master ):
		self.fenster = Toplevel( master )
		self.label = Label( self.fenster ) 
		self.label.pack( side = TOP, fill = BOTH, expand = YES )

		self.jaButton = Button(self.fenster, width=13,
				text = 'Ja',
				     command = self.ja)
		self.jaButton.pack(side = LEFT, padx=5)
		
		self.neinButton = Button(self.fenster,
				    text = 'Nein',width=13,
				    command = self.nein)
		self.neinButton.pack(side = RIGHT, padx=5)
		
	
		self.fenster.protocol('WM_DELETE_WINDOW', self.nein)

	def showMessage( self, title = '', message = '' ):
		self.fenster.title(title)
		self.label.configure( text = message )
		self.booleanValue = TRUE
		self.fenster.grab_set()
		self.fenster.focus_set()
		self.fenster.wait_window()
		return self.booleanValue

	def ja( self ):
		self.booleanValue = TRUE
		self.fenster.destroy()

	def nein( self ):
		self.booleanValue = TRUE
		self.fenster.destroy()

root=Tk()
Demo(root)
bei Unklarheiten einfach fragen.

Gruss
pyStyler

Verfasst: Freitag 6. Oktober 2006, 17:34
von prof_weirdo
Danke :D

Werde ich mir morgen mal genau ansehen. Bei Fragen melde ich mich.

Verfasst: Freitag 6. Oktober 2006, 21:09
von Mawilo
So als Beispiel hätte ich folgendes anzubieten:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import Tkinter as tk
import tkMessageBox as tkMB


def saveData():
    if tkMB.askyesno('Daten speichern',
                    'Möchten Sie die ungesicherten Daten speichern?'):
        print 'Daten speichern'
        """hier sollte die Funktion zum Speichern stehen und dann kann die 
        Funktion close() aufgerufen werden"""
    else:
        close()
        
def close():
    root.destroy()
        

root = tk.Tk()
root.protocol('WM_DELETE_WINDOW', saveData)

frame = tk.Frame(root)
frame.pack(fill = tk.X)

closebutton = tk.Button(frame, text = 'Beenden', command = saveData)
closebutton.pack()

root.mainloop()
Ich verwende das Modul tkMessageBox. Einfach das Schließen mit WM_DELETE_WINDOW abfangen und eine Funktion ranhängen. WinAPI musst du dafür nicht erst bemühen.

Stephan

PS: sollte mal ins Tkinter-Forum verschoben werden

Verfasst: Samstag 7. Oktober 2006, 00:54
von prof_weirdo
Ja, genau das habe ich gesucht. Danke PyStyler und Stephan. Habt mir echt geholfen :D