Menüleiste in Fenster platzieren, funktioniert nicht

Plattformunabhängige GUIs mit wxWidgets.
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Hallo,

ich habe ein Mini-Programm welches zuerst einen kleinen Abfragedialog startet. Nachdem der Benutzer einen Text eingegeben und bestätigt hat, erscheint ein weiteres Fenster. Leider wird im zweiten Fenster nicht meine Menüleiste angezeigt. Ich habe englischsprachige Kommentare eingefügt, da ich zuerst im englischsprachigen #wxpython IRC-Channel gefragt habe. Leider konnte ich dort keine Antwort erhalten. Weis jemand wieso meine Menüleiste nicht angezeigt wird?

Code: Alles auswählen

import wx
# -*- coding: utf-8 -*-   

class wxpythoninfo(wx.Frame):

	def __init__(self,parent,id):
		wx.Frame.__init__(self,parent,id,'FTitle', size=(300,200))
		panel=wx.Panel(self)
		
		# Textinput-dialogue
		box=wx.TextEntryDialog(None, "Text over input field", "Windowtitle", "input anything")
		
		# after the first window with the textfield
		if box.ShowModal()==wx.ID_OK:
					
			# the following appears
			wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
			panel=wx.Panel(self)
			
			# isn't appearing begin
			menubar=wx.MenuBar()
    
			first=wx.Menu()
			second=wx.Menu()
			
			menubar.Append(first,"File")
			menubar.Append(second,"Edit") 
    
			first.Append(wx.NewId(),"New window","That's a new window." )
			
			first.Append(wx.NewId(),"Open","Opens a new window." )
    
			self.SetMenuBar(menubar)
			
			# isn't appearing end
    
if __name__=='__main__':
   #inits the program
   app=wx.PySimpleApp()
   
   #shows the program
   frame=wxpythoninfo(parent=None,id=-1)
   frame.Show()
   app.MainLoop()
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Bei mir funktioniert es.
http://www.felix-benner.com
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

tordmor hat geschrieben:Bei mir funktioniert es.
Also es gibt auch bei mir keinerlei Fehlermeldungen. Aber es erscheint eben die Menüleiste mit "File" und "Edit" nicht:

Bild

Ist jemand so gut und beschreibt mir den Grund dafür?
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Bei mir gehts auch nicht. Du hast wx.Frame zweimal initialisiert, darum.
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Wenn ich die zweite wx.Frame-Initialisierung auskommentiere, gelange ich zum selbigen Ergebnis:

Code: Alles auswählen

import wx
# -*- coding: utf-8 -*-   

class wxpythoninfo(wx.Frame):

	def __init__(self,parent,id):
		wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
		panel=wx.Panel(self)
		
		# var defining test
		test = 'testtext'
		
		# Eingabedialog
		box=wx.TextEntryDialog(None, "Text over input field", "Windowtitle", test)
		
		# Speicherung des Wertes in answer-Variable, nach Klick auf OK
		if box.ShowModal()==wx.ID_OK:
			#answer=box.GetValue()
			
			
			# the following appears
			#wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
			panel=wx.Panel(self)
			
			# isn't appearing begin
			menubar=wx.MenuBar()
    
			first=wx.Menu()
			second=wx.Menu()
			
			menubar.Append(first,"File")
			menubar.Append(second,"Edit") 
    
			first.Append(wx.NewId(),"New window","That's a new window." )
			
			first.Append(wx.NewId(),"Open","Opens a new window." )
    
			self.SetMenuBar(menubar)
			
			# isn't appearing end
    
if __name__=='__main__':
   #inits the program
   app=wx.PySimpleApp()
   
   #shows the program
   frame=wxpythoninfo(parent=None,id=-1)
   frame.Show()
   app.MainLoop()
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Wenn ich ok drücke, ist das Menü sichtbar. Das Beispiel ist ein wenig "eigenartig". Auch das Panel wird zweimal initialisiert.
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Ich sehe nur das hier (unter Ubuntu 10.04):

Bild

Die doppelte Initialisierung des Panels habe ich entfernt.
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Ubuntu 10.04, hmm? bin bin "noch" auf 9.10. Wenn das so ist, tu ich lieber nicht upgraden. ;) Läuft überhaupt das demo. Was hast du für a) Python Version und b) wxPyhton Version?

Code: Alles auswählen

 franz@franz-desktop:~$ python 
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>> wx.VERSION
(2, 8, 10, 1, '')
Probier doch mal das Minimal Sample hier:

Code: Alles auswählen

import wx

class MyMenu(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, -1, title,
                          wx.DefaultPosition, wx.Size(200, 150))
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(101, '&Open', 'Open a new document')
        file.Append(102, '&Save', 'Save the document')
        menubar.Append(file, '&File')
        self.SetMenuBar(menubar)

class MyApp(wx.App):
    def OnInit(self):
        frame = MyMenu(None, -1, "Small Menu sample")
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()
Das muss gehen, sonst hat es etwas mit der Installation oder sonst etwas.

Vielleicht passt aber auch einfach der return wert nicht.

Was bekommst du als Ausgabe bei:
http://pastebin.com/ZPSUD3Az

(Das TextEntryDialog braucht als parent "panel" und nicht "None", sonst schließt das Programm nicht mehr ordnungsgemäß).
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Interessant, wie vielseitig wxPython ist. Bei mir (Ubuntu 9.10) verabschiedet sich das Programm mit folgender Fehlermeldung

Code: Alles auswählen

swig/python detected a memory leak of type 'wxFrame *', no destructor found.
Das nennt man wohl undefiniertes Verhalten :wink:

Die Fehlerursache liegt mit Sicherheit beim zweiten Aufruf der Initialisierung (und wofür soll eigentlich das zweite Panel gut sein?)
Wenn ich diese Zeilen auskommentiere

Code: Alles auswählen

# the following appears
wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
panel=wx.Panel(self)
und als parent des Dialogs self angebe,

Code: Alles auswählen

# Textinput-dialogue
box=wx.TextEntryDialog(self, "Text over input field", "Windowtitle", "input anything")
tut das Programm bei mir genau das, was es soll:
- Dialog mit [OK] bestätigen => Frame mit Menü
- Dialog mit [Abbrechen] schließen => Frame ohne Menü

War es das, was du erreichen wolltest?
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Francesco hat geschrieben:Ubuntu 10.04, hmm? bin bin "noch" auf 9.10. Wenn das so ist, tu ich lieber nicht upgraden. ;) Läuft überhaupt das demo. Was hast du für a) Python Version und b) wxPyhton Version?

Code: Alles auswählen

jepster@misia:~$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>> wx.VERSION
(2, 6, 3, 2, '')
>>> 
Seltsamerweise bekomme ich nicht dasselbe Verhalten wie ntrunk, wenn ich ebenso vorgehe wie er:

Code: Alles auswählen

import wx
# -*- coding: utf-8 -*-   

class wxpythoninfo(wx.Frame):

	def __init__(self,parent,id):
		wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
		
		# var defining test
		test = 'testtext'
		
		# Eingabedialog
		box=wx.TextEntryDialog(self, "Text over input field", "Windowtitle", test)
		
		# Speicherung des Wertes in answer-Variable, nach Klick auf OK
		if box.ShowModal()==wx.ID_OK:
			#answer=box.GetValue()
			
			
			# the following appears
			#wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
			panel=wx.Panel(self)
			
			# isn't appearing begin
			menubar=wx.MenuBar()
    
			first=wx.Menu()
			second=wx.Menu()
			
			menubar.Append(first,"File")
			menubar.Append(second,"Edit") 
    
			first.Append(wx.NewId(),"New window","That's a new window." )
			
			first.Append(wx.NewId(),"Open","Opens a new window." )
    
			self.SetMenuBar(menubar)
			
			# isn't appearing end
    
if __name__=='__main__':
   #inits the program
   app=wx.PySimpleApp()
   
   #shows the program
   frame=wxpythoninfo(parent=None,id=-1)
   frame.Show()
   app.MainLoop()
Ich bin neu bei wxPython und komme aus der PHP-Ecke. Ist das bei wxPython öfter so, dass sich das Verhalten von Version zu Version deutlich unterscheidet?
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
BlackJack

@pe: Du vergleichst da irgendwie Äpfel mit Birnen. PHP ist eine Programmiersprache und `wxWidgets` ist eine GUI-Bibliothek. Wenn sich da 2.6.x anders als 2.8.x verhält, dann hat das nichts mit PHP oder Python zu tun. Das wäre mit einer PHP-Anbindung an wxWidgets genau das gleiche.

Das sich 2.6 und 2.8 teilweise etwas deutlicher unterscheiden liegt an dem Versionssprung. Software entwickelt sich halt weiter und bei einer Minor-Nummer kann sich bei wxWidgets auch etwas nicht rückwärtskompatibel ändern.

Wobei ein paar Sachen hier aber auch einfach undefiniertes Verhalten sind, weil Du Dich nicht an die Regeln hältst. Das führt halt nicht immer zu eindeutigen Fehlermeldungen und auch nicht immer sofort an der Stelle wo Du etwas falsch machst, sondern kann halt auch erst später durch komisches Verhalten oder Abstürze bestraft werden. Betonung auf *kann*. Muss nicht zwangsläufig. Also nur weil ein Code (scheinbar) funktioniert, heisst das nicht, dass er fehlerfrei ist.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

@pe: ich würde dir unbedingt empfehlen (ausser du hast triftige Gründe, es nicht zu tun), einmal auf die letzte wxPy 2.8 zu wechseln (zb 2.8.11).
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Hast du in den if-Zweig schonmal eine print-Anweisung eingebaut, um zu sehen, ob der ueberhaupt ausgefuehrt wird?

Ich sehe die Menues, wenn ich OK clicke. (wx 2.8 mit dem letzten Codebeispiel.)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Rebecca hat geschrieben:Hast du in den if-Zweig schonmal eine print-Anweisung eingebaut, um zu sehen, ob der ueberhaupt ausgefuehrt wird?

Ich sehe die Menues, wenn ich OK clicke. (wx 2.8 mit dem letzten Codebeispiel.)
Genau das habe ich mir auch gedacht. Darum habe ich in dem obigen Beispiel (meinen pastebin) link auch einen Dialog ausgegeben, falls das wider Erwarten nciht ausgeführt wird.
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Ich habe festgestellt, dass ich die 2.6er und 2.8er Version von wxWidgets hatte. Als ich die 2.6er deinstalliert habe, kam der von ntrunk beschriebene "memory leak". Nach der Entfernung der doppelten Initialisierung kommt keine Fehlermeldung mehr, aber weiterhin keine Menüleiste, nachdem ich bei der Abfrage auf "OK" klicke.

Das ist der derzeitige Stand des Codes:

Code: Alles auswählen

import wx
# -*- coding: utf-8 -*-   

class wxpythoninfo(wx.Frame):

	def __init__(self,parent,id):
		wx.Frame.__init__(self,parent,id,'Window title', size=(300,200))
		panel=wx.Panel(self)
		
		# var defining test
		test = 'testtext'
		
		# Eingabedialog
		box=wx.TextEntryDialog(self, "Text over input field", "Windowtitle", test)
		
		# Speicherung des Wertes in answer-Variable, nach Klick auf OK
		if box.ShowModal()==wx.ID_OK:
			answer=box.GetValue()
			
			
			# isn't appearing begin
			menubar=wx.MenuBar()
    
			first=wx.Menu()
			second=wx.Menu()
			
			menubar.Append(first,"File")
			menubar.Append(second,"Edit") 
    
			first.Append(wx.NewId(),"New window","That's a new window." )
			
			first.Append(wx.NewId(),"Open","Opens a new window." )
    
			self.SetMenuBar(menubar)
			
			# isn't appearing end
    
if __name__=='__main__':
   #inits the program
   app=wx.PySimpleApp()
   
   #shows the program
   frame=wxpythoninfo(parent=None,id=-1)
   frame.Show()
   app.MainLoop()
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

@pe: dein letztes Code-Beispiel scheint in Ordnung zu sein, zumindest funktioniert es bei mir (mit copy&paste übernommen) anstandslos.

Evtl. ist deine wx-Installation defekt. Leider k.A. wie du das sicher feststellen kannst und ob oder wie du das in diesem Fall ohne De- und anschl. Neuinstallation repariert bekommst.

Hast du das Beispiel von Francesco mal ausgeführt oder den Vorschlag von Rebecca ausprobiert? Welche Ergebnisse bekommst du dann?
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

ntrunk hat geschrieben:@pe: dein letztes Code-Beispiel scheint in Ordnung zu sein, zumindest funktioniert es bei mir (mit copy&paste übernommen) anstandslos.
Also bei dir erscheint "File" und "Edit" oben in der Menüleiste?
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
BlackJack

@pe: Wie führst Du das Programm eigentlich aus? Aus irgendeiner IDE?
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

BlackJack hat geschrieben:@pe: Wie führst Du das Programm eigentlich aus? Aus irgendeiner IDE?
Ja, aus Geany heraus. Wenn ich es aber mit Python allein aufrufe (python mein-programm.py), komme ich zum selben Ergebnis.
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
pe
User
Beiträge: 44
Registriert: Dienstag 2. Februar 2010, 18:33

Francesco hat geschrieben: Was bekommst du als Ausgabe bei:
http://pastebin.com/ZPSUD3Az
Hier bekomme ich auch nur das Fenster ohne Menüleiste. Das Minimal-Beispiel funktioniert, jedoch hätte ich davor gerne das Eingabefeld.
Ich bedanke mich für Eure Zeit und Aufmerksamkeit.
Antworten