MessageBox

Fragen zu Tkinter.
Antworten
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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 ;-)
http://www.cs.unm.edu/~dlchao/flake/doom/
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

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 :(
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Danke :D

Werde ich mir morgen mal genau ansehen. Bei Fragen melde ich mich.
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Ja, genau das habe ich gesucht. Danke PyStyler und Stephan. Habt mir echt geholfen :D
Antworten