Seite 1 von 1

Aktives Panel aus Notebook bestimmen

Verfasst: Sonntag 10. Dezember 2006, 11:12
von calo
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

Re: Aktives Panel aus Notebook bestimmen

Verfasst: Sonntag 10. Dezember 2006, 12:13
von gerold
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.

Verfasst: Sonntag 10. Dezember 2006, 12:43
von gerold
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

Verfasst: Sonntag 10. Dezember 2006, 13:12
von HWK
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

Verfasst: Sonntag 10. Dezember 2006, 13:42
von HWK
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

Verfasst: Sonntag 10. Dezember 2006, 15:51
von gerold
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
:-)

Verfasst: Sonntag 10. Dezember 2006, 18:50
von HWK
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

Verfasst: Montag 11. Dezember 2006, 16:49
von calo
Hi,

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

Grüßle, Calo