Seite 1 von 1

Buttons, Eingabefelder über eine Grafik legen

Verfasst: Donnerstag 2. August 2007, 14:26
von Sr4l
Hallo,
ich versuche mit wxPython ein Bitmap als Hintergrund zulegen und darüber Buttons, TextCtrl usw. zu legen. Ich schaffe es aber nicht die Buttons auf das Bitmap zuholen und verstehe nicht warum.
Auf die Idee bin ich durch den Beitrag "GUIs selber zeichnen" (siehe Fernziel) gekommen, was ich auch geschafft habe dank der Samples von wxPython.
In einem Panel geht garnicht da wird der Button genauso groß wie das Bild ohne auf meine Größenangaben zu hören. Also habe ich es mit 2Panelen in einem Frame versucht aber auch das geht nicht ganz.

Ich bitte um eine Gedankenanstoß. Danke.


Fernziel (GUIs selber zeichnen):
http://www.python-forum.de/topic-11493.html

Mein Code (abgeleitet von Gerolds Beispiel aus http://www.python-forum.de/topic-11508.html )
http://paste.pocoo.org/show/2158/

Verfasst: Donnerstag 2. August 2007, 14:40
von nkoehring
Du kannst auch auf deinem Frame das Hintergrundbild zeichnen...

http://paste.pocoo.org/show/2159/(quickhack...)

Verfasst: Donnerstag 2. August 2007, 15:09
von Sr4l
richtig das kann ich machen dann habe ich das Bild,
setze ich in dem Frame aber eine Button wird er wieder so groß wie das Bild.

lagere ich den Button in ein Pannel aus funktioniert es, nur sehe ich das Bild nicht das neue Panel ist so groß wie das Bild und verdeckt es komplett.

Verfasst: Donnerstag 2. August 2007, 17:26
von nkoehring
ja, ich habe dein Problem mal testweise nachvollzogen. Ich weiß auch nicht warum das so ist. Bei Grafiken funktioniert es...

Re: Buttons, Eingabefelder über eine Grafik legen

Verfasst: Donnerstag 2. August 2007, 18:28
von gerold
Sr4l hat geschrieben:Ich bitte um eine Gedankenanstoß.
Hallo Sr4l!

Die Sache ist die, dass wenn nur ein Widget in einen Container gelegt wird, dieses Widget den gesamten Platz des Containers einnimmt. Werden mehrere Widgets in den Container gelegt, dann wird dieser Mechanismus auser Kraft gesetzt.

Wozu ist das gut? Es wäre wirklich blöd, wenn man jedes mal, wenn in das Frame das übliche Panel gelegt wird, wenn man sich ständig selber darum kümmern müsste, dass dieses Panel den gesamten Platz einnimmt.

Für alles Andere nimmt man Sizer. Die kümmern sich um die Anordnung der Widgets. Möchte man z.B. ein einziges Widget (z.B. einen Button) genau in der Mitte eines Containers anordnen, ohne dass diser Button die gesamte Fläche einnimmt, dann gibt man diesen Button in einen Sizer.

Dieses Verhalten fällt nicht auf, wenn man ein ``wx.StaticBitmap`` als einziges Widget in einen Container legt. Die Grafik wird ja nicht gestreckt -- aber das Widget nimmt doch den kompletten Bereich ein.

Und hier noch das Beispiel:

Code: Alles auswählen

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

import wx

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


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        panel.Bind(wx.EVT_PAINT, self.on_panel_paint)
        self.panel = panel
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        vbox_main.AddStretchSpacer()
        
        button1 = wx.Button(panel, -1, "Hallo")
        vbox_main.Add(button1, 0, wx.CENTER)
        
        vbox_main.AddStretchSpacer()
        
        button2 = wx.Button(panel, -1, "Welt")
        vbox_main.Add(button2, 0, wx.CENTER)
        
        vbox_main.AddStretchSpacer()
    
    
    def on_panel_paint(self, event):
        dc = wx.PaintDC(self.panel)
        dc.DrawCircle(200, 200, 100)


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)

PS: Fast hätte ich es vergessen: Es ist alles noch recht einfach, solange du nicht mit Transparenz arbeiten willst/musst.
@nkoering: Ich würde alles in einem Grafikprogramm zeichen, dieses Bild in mehrere Abschnitte zerlegen und in wx.Panels zeichnen und auch wx.StaticBitmaps verwenden. -- Alles ohne Transparenz.

Verfasst: Donnerstag 2. August 2007, 22:10
von Sr4l
ach vielen dank.

ich habe das nicht an `self.panel` sondern einfach nur an `self` und dadurch an den Frame und nicht an das Panel. Danke danke danke. Habe 6std davor gesessen und so viele tausend Sachen ausprobiert. Naja das macht die Erfahrung wertvoller :-D