Komisches Aussehen unter Windows

Plattformunabhängige GUIs mit wxWidgets.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:[...]
Hä? Ich denke du widersprichst dir grad selbst: erst sagst du, dass es nur per Farbeingabe geht und dann sagst du dasss man das dem OS überlassen soll.
Nein. Ich habe nur auf seine erste Frage eine der Frage entsprechende Antwort gegeben! Ob ich das für richtig halte oder nicht sei dahingestellt, das es nicht darum ging. Ich habe es lediglich trotzdem später erwähnt um ihn darüber in Kenntnis zu setzen wie ich den Vorgang betrachte (und die Mehrheit). -> Ich es also als schlechten Stil ansehe.

Denoch habe ich trotzdem eine der Frage entsprechende Antwort geliefert. Wenn es um ``global`` geht würde ich auch dementsprechende antworten __aber__ mit den gleichen Vorbehalt wie hier -> Z.B. "So und so geht es mit global, aber lass trotzdem die Finger von ``global`` weile es ein schlechter Stil ist" ;)
Leonidas hat geschrieben:[...]
Natürlich soll man sowas dem Toolkit überlassen!
Korrekt!
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:
basti33 hat geschrieben:Und wieso ist die Lösung mit dem wx.Panel jetzt "unsauber"?
Sie ist IMHO gar nicht unsauber.
Jain. Ist es eigentlich nicht, bis auf die Tatsache das man nun das wxPanel als Parent nutzen muss (Und das nur obwohl wir dioch nur die Hintergrundfarbe ändern wollen, bzw. von nem ``wxPanel`` habe wollen)

Code: Alles auswählen

class MainFrame(wx.Frame):
    def __init__(self, parent=None, id=-1, title = "MyApp"):
         wx.Frame.__init__(self, parent, id, title)
         self.bg = wx.Panel(self)
         
         txt1 = wx.TextCtrl(self.bg)
         txt2 = wx.TextCtrl(self.bg, pos=(120, 0))
Die sauberste Lösung um das Hintergrundfarbe von einem ``wxPanel`` zu erhalten, ohne eines zu erzeugen und ohne es als Parent benutzen zu müssen ist folgende:

Code: Alles auswählen

class MainFrame(wx.Frame):
    def __init__(self, parent=None, id=-1, title = "MyApp"):
         wx.Frame.__init__(self, parent, id, title)
         # ``wx.Panel(self).GetBackgroundColour()`` hohlt die RGB-Werte
         # von dem wxPanel. ``self.SetBackgroundColour(...)`` setzt die
         # Hintergrundfarbe neu mit den geholten RGB-Werten.
         self.SetBackgroundColour(wx.Panel(self).GetBackgroundColour())
         
         # ``self`` kann weiterhin als Parent genutzt werden :)
         txt1 = wx.TextCtrl(self)
         txt2 = wx.TextCtrl(self, pos=(120, 0))
Wir wollen doch nur die RGB-Werte von einem non-wxFrame haben und wir wollen ``self`` doch weiterhin als Parent für darüberliegende Widgets nutzen. Wozu dann extra ein ``wx.Panel`` Instanz erzeugen und uns diese Instanz als Parent aufzwinge lassen __nur__ wegen der Hintergrundfarbe :)

Das ist meiner Meinung nach die sauberste und direkteste Lösung.

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

Hi!

Jetzt muss ich doch eingreifen. :?

Wer es noch nicht wusste --> nehmt es als vorgegeben hin:

Code: Alles auswählen

     Frame 
       |
     Panel
       |
sonstige Widgets (z.B. wx.StaticText)
Auf ein Frame gehört ein Panel, damit unter allen unterstützten Betriebssystemen ein Fenster wie ein dort übliches Fenster aussieht.

Es gibt natürlich Ausnahmen. Z.B. ``wx.Notebook`` oder ``wx.SplitterWindow``.

Ein Panel ist z.B. auch dafür verantwortlich, dass man mit der TAB-Taste von einem Widget zum nächsten wechseln kann. Willst du einen Standard-Button definieren -- brauchst du Panels. Willst du mehr Code wiederverwenden können -- brauchst du Panels.

mfg
Gerold
:-)

PS: wxPython in Action - Seite 227.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

gerold hat geschrieben: Ein Panel ist z.B. auch dafür verantwortlich, dass man mit der TAB-Taste von einem Widget zum nächsten wechseln kann.
Das ist natürlich ein Argument.

lg
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hmm... Der Thread ist ja nun schon fast 3 Jahre alt, ich hoffe mal, dass meine Frage überhaupt noch von jemandem registriert wird... :-)

Die Gründe, weshalb ein Panel quasi als "Container" der Widgets verwendet werden soll, sind mir mehr oder weniger bekannt. Allerdings verstehe ich nicht, weshalb denn überhaupt ein Panel definiert werden muss. Gibt es auch manchmal einen Grund, kein Panel zu definieren? Ich kann den genauen Unterschied zwischen Frame und Panel nicht erkennen. Weshalb ist innerhalb eines Frames nicht gleich automatisch ein Panel angelegt?

Liebe Grüße
mutetellla
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Weil man vielleicht statt dem Panel andere Widgets verwenden will, z.B. SplitterWindow oder ScrolledPanel oder AUI oder MDI etc. etc. ... :)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Irgendwie ist mir das schon klar, aber irgendwie auch nicht. Ich denke einfach mal, dass ich noch zu wenig Erfahrung mit dem ganzen Zeugs habe... :-)

Das ganze theoretische "darüber lesen" ist das eine, das Gelesene dann in ein funktionierendes Programm umsetzen wieder ein ganz anderes.

Liebe Grüße
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten