Buttons, Eingabefelder über eine Grafik legen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 2. August 2007, 14:26

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/
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Donnerstag 2. August 2007, 14:40

Du kannst auch auf deinem Frame das Hintergrundbild zeichnen...

http://paste.pocoo.org/show/2159/(quickhack...)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 2. August 2007, 15:09

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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Donnerstag 2. August 2007, 17:26

ja, ich habe dein Problem mal testweise nachvollzogen. Ich weiß auch nicht warum das so ist. Bei Grafiken funktioniert es...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 2. August 2007, 18:28

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.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 2. August 2007, 22:10

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
Antworten