Listbox in neuem Fenster öffnen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Halli Hallo , melde mich auch mal wieder mit einem Problem :>
Topic klingt ganz simpel, ist es aber für mich nicht.

Erklärung:
Ich habe ein Panel was in einem Frame liegt. Dort sind allerlei Dinge
enthalten. Buttons, Eingabefelder etc..

Code: Alles auswählen

class ConvertGui(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None, -1, 'Convert', (350,400), (460, 100), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
    self.panel = wx.Panel(self, -1)
Nun möchte ich, dass durch einen Button Klick, ein neues Fenster erscheint
was fast komplett mit einer Listbox befüllt ist. Ich dachte, man könnte das ganze in eine neue Klasse stecken, doch da ich nicht so der Fachmann in der Beziehung bin, sind meine Versuche bis jetzt völlig gescheitert :)
Hier mal mein Ansatz:

Code: Alles auswählen

#Wir befinden uns in der Datei gui.py
#Durch Button Klick wird diese Methode aufgerufen
import gui2
def checkExtras(self):
  gui = gui2.Uff()

#Datei gui2
import gui, wx

class Uff(wx.Frame, gui):
  def __init__(self):
    wx.Frame.__init__(self, None, -1, 'List', (350,400), (300, 200), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
    self.panel = wx.Panel(self, -1)
  
    self.list = wx.ListBox(panel, -1)
Trotz zig Fehler die ich behoben habe kommen immer neue :)
Hier mal die Letzte:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\test\python\diamant\gui.py", line 4, in ?
    import wx, os, os.path, FileConvert, gui2
  File "C:\test\python\diamant\gui2.py", line 3, in ?
    class Uff(wx.Frame, gui):
TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Falls einer eine andere Idee hat, wie ich eine Listbox und 2 Buttons in ein Popup kriege, so nehme ich auch gerne diese an :D
Gruss prosta
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo prosta,

1) Meinst du mit Popup einen Dialog oder ein Frame (oder MiniFrame)?

2) Du importierst gegenseitig (weiss nicht, ob das so optimalist)
das verstehe ich nicht ganz:
in gui: import gui2 und vice versa.

#Datei gui2

Code: Alles auswählen

import gui, wx

class Uff(wx.Frame, gui):
#hier warum? ist das eine zweite basisklasse?
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

1) Meinst du mit Popup einen Dialog oder ein Frame (oder MiniFrame)?
Tjoa, eigentlich ist mir das egal ^^ Was eignet sich denn am besten dafür? Ich möchte eigentlich nur ein Fenster haben, wo 2 Buttons und eine Listbox drin sind. Dachte, dafür wäre ein neuer Frame geeignet.

Die 2. Klasse sollte dazu dienen, ein neues Fenster mit der Listbox zu öffnen. War mir nicht ganz im klaren darüber, wie man das anders hätte machen können ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

wie wäre denn (Pseudocode):

Code: Alles auswählen

class MeinAppMainFrame(wx.Frame):
    def __init__(...):
         bla bla
    def EinEventDialog(self,*args):
         meinelistbox = MeinListBoxDialog(self,*args)
         meinelistbox.show()
#und dann eine Klasse, welche MeinListBoxDialog, z.B. mit einem panel, definiert.
Gruß,
Christian
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

#und dann eine Klasse, welche MeinListBoxDialog, z.B. mit einem panel, definiert.
Ja aber das ist doch das Problem ^^
Irgendwie schaffe ich es nicht, eine Listbox in einem neuen Fenster erscheinen zu lassen oO Das es in einem neuen Panel im Hauptframe zu sehen ist, ist ja kein Problem. Aber ich möchte halt so etwas wie einen
MessageDialog, ein Popu halt :) Was eigentlich so einfach klingt entpuppt sich hier als harte Aufgabe. Es muss ja auch nicht zwingend in einer neuen Klasse stehen, war nur mein erster Versuch.

*edit* Narf CM
Du hattest mir ja schon den richtigen Tip gegeben. War nur zu blind um das zu erkennen, danke ^^
Gelöst wurde es nun so:

Code: Alles auswählen

import gui2

  def checkExtras(self, event):
    meinelistbox = gui2.Uff()
    meinelistbox.Show(True) 

import wx

class Uff(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None, -1, 'List', (350,400), (300, 200), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
    self.panel = wx.Panel(self, -1)
    self.list = wx.ListBox(self.panel, -1)
gruss
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ok, ein Beispiel:

Code: Alles auswählen

class RestrictionDialog(wx.Dialog):
	def __init__(self, *args, **cmds):
		wx.Dialog.__init__(self, *args, **cmds)
		self.parent = args[0] #was auch immer von der parent-Klasse kommt, kannst
                                                #Du z.B. so verwursten
               VSPACE = 10
              <snip>Irgendein Zeug mit Sizern und Buttons und Co</snip>
               enz_select = wx.ListBox(self,100,wx.DefaultPosition,wx.DefaultSize,enz_list,wx.LB_MULTIPLE)
		
		self.enz_select = enz_select
		self.enz_select.Bind(wx.EVT_LISTBOX,self.OnKey)
		sizer1.Add(enz_select)
		
		buttons = wx.BoxSizer(wx.HORIZONTAL)
		buttons.Add((VSPACE,-1),0)
		b = wx.Button(self,wx.ID_OK,"Okay")
		b.SetDefault()
		buttons.Add(b,0,wx.ALL,10)
		buttons.Add(wx.Button(self,wx.ID_CANCEL,"Cancel"),0,wx.ALL,10)
		
		border=wx.BoxSizer(wx.VERTICAL)
		border.Add(sizer1,1,wx.GROW|wx.ALL,25)
		border.Add(buttons)
		self.SetSizer(border)
		border.Fit(self)
		self.Layout()
Dies alles geht sicher auch eleganter, ist so aber recht übersichtlich. Ich habe mal unterstellt, daß Du eine Listbox in einem Auswahldialog nutzen willst und ein Beispiel mit eigenem Code gepastet. Falls das nicht reicht, werde ich gerne auch ein Komplettbeispiel erstellen (aber schau einmal in die Beispiel die wxPython mitliefert) - nur muß ich jetzt leider einen Termin wahrnehmen und kann erst am späten Nachmittag wieder reinschauen, wenn überhaupt.

Gruß,
Christian

edit: Irgendwie klappt das mit der Einrückung nicht so richtig, meine Zeilen sind wohl zu lang. Ich hoffe Du wirst trotzdem daraus schlau.
Antworten