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/
Buttons, Eingabefelder über eine Grafik legen
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
Du kannst auch auf deinem Frame das Hintergrundbild zeichnen...
http://paste.pocoo.org/show/2159/(quickhack...)
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
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
- Sr4l
- User
- Beiträge: 1091
- Registriert: Donnerstag 28. Dezember 2006, 20:02
- Wohnort: Kassel
- Kontaktdaten:
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.
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.
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
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
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Sr4l!Sr4l hat geschrieben:Ich bitte um eine Gedankenanstoß.
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()
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- Sr4l
- User
- Beiträge: 1091
- Registriert: Donnerstag 28. Dezember 2006, 20:02
- Wohnort: Kassel
- Kontaktdaten:
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
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
