Aktives Panel aus Notebook bestimmen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
calo
User
Beiträge: 41
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Sonntag 10. Dezember 2006, 11:12

Hallo wxPython-Gemeinde,

wie bestimme ich in einem Frame, dass aus mehreren Notebook-Panels (mit TextCtrl) besteht das aktive Panel um es abzuspeichern?

Code: Alles auswählen

import wx
import os

wx.SetDefaultPyEncoding("iso-8859-1")

ID_NEW = 100
ID_OPEN = 101
ID_SAVE = 102
ID_EXIT = 104


class EditPanel(wx.Panel):
	def __init__(self, parent):
		wx.Panel.__init__(self, parent)
		self.filename = ''
		self.dirname = ''

		vbox = wx.BoxSizer(wx.VERTICAL)
		self.SetSizer(vbox)

		self.text = wx.TextCtrl(self, 1, "", style=wx.TE_MULTILINE)
		vbox.Add(self.text, proportion = 1, flag = wx.ALL | wx.EXPAND, border=1)


class MainFrame(wx.Frame):
	def __init__(self):
		wx.Frame.__init__(self, None, title="Simple Notebook Example")
		self.CreateStatusBar()
		
		filemenu = wx.Menu()
		filemenu.Append(ID_NEW, "&New", "Create a new file")
		filemenu.Append(ID_OPEN, "&Open", "Open a file")
		filemenu.Append(ID_SAVE, "&Save", "Save the active file")
		filemenu.Append(ID_EXIT, "E&xit", "Terminate the Program")
		wx.EVT_MENU(self, ID_NEW, self.OnNew)
		wx.EVT_MENU(self, ID_OPEN, self.OnOpen)
		wx.EVT_MENU(self, ID_SAVE, self.OnSave)
		wx.EVT_MENU(self, ID_EXIT, self.OnExit)

		menubar = wx.MenuBar()
		menubar.Append(filemenu, "&File")
		self.SetMenuBar(menubar)

		self.ePanel = []
		editMainPanel = wx.Panel(self)
		self.createEditorNotebook(editMainPanel)


	###########################################################################
	# HaupteditorPanel ...
	def createEditorNotebook(self, parent):
		vbox = wx.BoxSizer(wx.VERTICAL)
		parent.SetSizer(vbox)
		
		self.nb = wx.Notebook(parent, style = wx.NB_BOTTOM)
		vbox.Add(self.nb, 1, wx.ALL | wx.EXPAND, border = 5)

	###########################################################################
	# Neues File erzeugen
	def OnNew(self, event):
		n = len(self.ePanel)
		self.ePanel.append(EditPanel(self.nb))
		self.filename = "default.txt"
		self.nb.AddPage(self.ePanel[n], self.filename)

	###########################################################################
	# Programm beenden
	def OnExit(self, event):
		self.Close(True)

	###########################################################################
	# File oeffnen
	def OnOpen(self, event):
		self.dirname = ""
		dlg = wx.FileDialog(self, "Open", self.dirname, "", "*.*", wx.OPEN)
		if dlg.ShowModal() == wx.ID_OK:
			filename = dlg.GetFilename()
			dirname = dlg.GetDirectory()
			f = open(os.path.join(dirname,filename),'r')

			n = len(self.ePanel)
			self.ePanel.append(EditPanel(self.nb))
			self.nb.AddPage(self.ePanel[n], filename)
			self.ePanel[n].text.SetValue(f.read())
			self.ePanel[n].filename = filename
			self.ePanel[n].dirname = dirname

			f.close()
		dlg.Destroy

	###########################################################################
	# Datei aus aktivem Panel speichern
	def OnSave(self, event):
		# print self.ePanel[0].text.GetValue()

		# activePanel = event.GetActiveObject() # Enthaelt leider 'nur' das MainObject "MainFrame"

		"""if activePanel.dirname == "":
			self.dirname = ""
			dlg = wx.FileDialog(self, "Save", self.dirname, "", "*.*", wx.SAVE)
			if dlg.ShowModal() == wx.ID_OK:
				self.filename = dlg.GetFilename()
				self.dirname = dlg.GetDirectory()
				f = open(os.path.join(self.dirname, self.filename), 'w')
				f.write(activePanel.text.GetValue())
				f.close()
			dlg.Destroy
		else:
			f = open(os.path.join(activePanel.dirname, activePanel.filename), 'w')
			print activePanel.text
			f.write(activePanel.text.GetValue())
			f.close()"""


if __name__ == "__main__":
	app = wx.App()
	f = MainFrame()
	f.Center()
	f.Show()
	app.MainLoop()

Sorry, ich habe es bereits auf das wesentlichste gekürtzt.

Grüße, Calo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Dezember 2006, 12:13

calo hat geschrieben:wie bestimme ich in einem Frame, dass aus mehreren Notebook-Panels (mit TextCtrl) besteht das aktive Panel
Hi Calo!

Sorry, aber ich habe ein Beispiel geschrieben, noch bevor ich dein Beispiel angesehen habe.

Die Lösung: ``event.GetSelection()``

Hier mein Beispiel:

Code: Alles auswählen

#gelöscht#
mfg
Gerold
:-)

PS: Vergiss nicht das Coding der Python-Datei im Kopf anzugeben.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Dezember 2006, 12:43

Hi!

Diesem neuen Beispiel, macht es nichts aus, wenn zwischendurch mal ein Panel gelöscht wird:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class EditPanel(wx.Panel):

    def __init__(self, parent, name):
        
        wx.Panel.__init__(self, parent, name = name)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        t = wx.TextCtrl(self, -1, name, style = wx.TE_MULTILINE)
        vbox.Add(t, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)


class MainFrame(wx.Frame):

    def __init__(self):
        
        wx.Frame.__init__(self, None, title = "Simple Notebook Example")
        
        p = wx.Panel(self)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        p.SetSizer(vbox)
        
        nb = wx.Notebook(p)
        vbox.Add(nb, 1, wx.ALL | wx.EXPAND, border = 5)
        
        edit_panel1 = EditPanel(nb, "Edit Panel 1")
        nb.AddPage(edit_panel1, "Edit 1")
        
        edit_panel2 = EditPanel(nb, "Edit Panel 2")
        nb.AddPage(edit_panel2, "Edit 2")
        
        self.nb = nb
        
        nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.on_notebook_changed)
    

    def on_notebook_changed(self, event = None):
        
        nb = self.nb
        current = event.GetSelection()
        
        print
        print "Ausgewaehltes Notebook:", current
        print "Panel:", nb.GetChildren()[current].GetName()
        
        event.Skip()


if __name__ == "__main__":
    app = wx.App()
    f = MainFrame()
    f.Center()
    f.Show()
    app.MainLoop()
mfg
Gerold
:-)

EDIT: ``event.Skip()`` eingefügt
Zuletzt geändert von gerold am Sonntag 10. Dezember 2006, 15:36, insgesamt 3-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 10. Dezember 2006, 13:12

Hallo, Gerold!
Du hast in on_notebook_changed

Code: Alles auswählen

event.Skip()
vergessen. Was ohne passiert, siehst Du, wenn Du

Code: Alles auswählen

t = wx.TextCtrl(self, 1, "", style = wx.TE_MULTILINE)
durch

Code: Alles auswählen

t = wx.TextCtrl(self, 1, name, style = wx.TE_MULTILINE)
ersetzt.
MfG
HWK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 10. Dezember 2006, 13:42

Hallo, Calo!
Eine Alternative wäre noch:

Code: Alles auswählen

        self.nb = wx.Notebook(p)
.
.
.
        self.nb.Bind(wx.EVT_LEFT_DOWN, self.on_notebook_changed)
.
.
.
    def on_notebook_changed(self, event): 
        self.current_selection = self.nb.HitTest((event.m_x, event.m_y))[0]
        print "Ausgewaehltes Notebook:", self.current_selection 
        print "Panel:", self.panels[self.current_selection].GetName()
        event.Skip()
Ich habe diese Variante einmal angewandt, weil ich unter Windows ME bei event.GetSelection() immer nur Unfug zurückerhalten habe. Ich habe es jetzt noch mal unter XP probiert. Hier funktioniert Gerolds Version.
MfG
HWK
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Dezember 2006, 15:51

HWK hat geschrieben: self.current_selection = self.nb.HitTest((event.m_x, event.m_y))[0]
Hi HWK!

Danke für den Hinweis auf ``Skip()``. Das hatte ich vergessen.

Oben aufgezeigter Code funktioniert nicht, wenn du die Tabs mit der Tastatur auswählst. Hoffentlich müssen wir uns nicht mehr lange mit Windows ME herumschlagen. :roll:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 10. Dezember 2006, 18:50

gerold hat geschrieben:Oben aufgezeigter Code funktioniert nicht, wenn du die Tabs mit der Tastatur auswählst.
Stimmt, aber meistens macht man es wohl mit der Maus.
gerold hat geschrieben:Hoffentlich müssen wir uns nicht mehr lange mit Windows ME herumschlagen.
Wohl wahr. Aber selbst ich bin jetzt auf XP umgestiegen.
MfG
HWK
calo
User
Beiträge: 41
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Montag 11. Dezember 2006, 16:49

Hi,

vielen Dank für die Tipps. Mittlerweile funktionieren meine Notebooks auch so wie sie sollen. :)

Grüßle, Calo
Antworten