Rechteck Zeichnen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

Grüßt euch,

Code: Alles auswählen

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

import wx
wx.SetDefaultPyEncoding("iso-8859-15") 
white = (255, 255, 255)

          

class UmlD(wx.Frame):
     def __init__(self):
          wx.Frame.__init__(self, None, -1, 'Organigram', size=(1200,750))
          self.panel = wx.Panel(self, -1)
        
          self.SetBackgroundColour(white)
        
        
        
          menubar = wx.MenuBar()

        
        #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
          file = wx.Menu()
          new = wx.MenuItem(file, 1, '&Neu')
          new.SetBitmap(wx.Bitmap('new.png'))
          file.AppendItem(new)
          
          
          offnen = wx.MenuItem(file, 2, u'&Öffnen')
          offnen.SetBitmap(wx.Bitmap('open.png'))
          file.AppendItem(offnen) 
          
          speichern = wx.MenuItem(file, 3, '&Speichern')
          speichern.SetBitmap(wx.Bitmap('save.png'))
          file.AppendItem(speichern) 
          
          file.AppendSeparator()
          
          quit = wx.MenuItem(file, 4, '&Beenden')
          quit.SetBitmap(wx.Bitmap('quit.png'))
          file.AppendItem(quit)
          
          self.Bind(wx.EVT_MENU, self.OnQuit, id=4)
          
        #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
        
          bearbeiten = wx.Menu()
          andern = wx.MenuItem(bearbeiten, 5, '&Ändern')
          andern.SetBitmap(wx.Bitmap('edit.png'))
          bearbeiten.AppendItem(andern) 
        
          erase = wx.MenuItem(file, 6, '&Löschen')
          erase.SetBitmap(wx.Bitmap('erase.png'))
          bearbeiten.AppendItem(erase) 
        
        #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
        
          einfugen = wx.Menu()
          klasse = wx.MenuItem(einfugen, 7, '&Neu')
          klasse.SetBitmap(wx.Bitmap('linie.png'))
          einfugen.AppendItem(klasse) 
          
          linie = wx.MenuItem(einfugen, 8, '&Kante')
          linie.SetBitmap(wx.Bitmap('linie.png'))
          einfugen.AppendItem(linie) 
          
          #erase = wx.MenuItem(file, 3, '&Loeschen')
          #erase.SetBitmap(wx.Bitmap('erase.png'))
          #bearbeiten.AppendItem(erase) 
          
          #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
        
          help = wx.Menu()
          info = wx.MenuItem(help, 9, '&Info')
          info.SetBitmap(wx.Bitmap('info.png'))
          help.AppendItem(info) 
          
          
        
          menubar.Append(file, '&Datei')
          menubar.Append(bearbeiten, '&Bearbeiten')
          menubar.Append(einfugen, '&Einfugen')
          menubar.Append(help, '&Hilfe')
          
          self.SetMenuBar(menubar)
          
          
        
          self.toolbar1 = wx.ToolBar(self.panel, -1)
          self.toolbar1.AddLabelTool(1, '', wx.Bitmap('new.png'))
          self.toolbar1.AddLabelTool(2, '', wx.Bitmap('open.png'))
          self.toolbar1.AddLabelTool(3, '', wx.Bitmap('save.png'))
          self.toolbar1.AddSeparator()
          self.toolbar1.AddLabelTool(11, '', wx.Bitmap('add.png'))
          self.toolbar1.AddLabelTool(5, '', wx.Bitmap('edit.png'))
          self.toolbar1.AddLabelTool(12, '', wx.Bitmap('erase.png'))
          self.toolbar1.AddSeparator()
          self.toolbar1.AddLabelTool(13, '', wx.Bitmap('rechteck.png'))
          self.toolbar1.AddLabelTool(14, '', wx.Bitmap('rechteck2.png'))
          self.toolbar1.Realize()
        
        
          self.Bind(wx.EVT_TOOL, self.zeichnenn, id=13)
        

        
          self.Centre()
          self.Show(True)  
    
        
        
     def OnQuit(self, event):
          self.Close()
    
   
     def zeichnenn(self,event):
          wx.EVT_PAINT(self.panel, self.zeichnen)
        
     def zeichnen(self, event):
          dc = wx.PaintDC(self.panel)
          dc.SetPen(wx.Pen(colour = wx.BLACK, width = 3, style = wx.SOLID))
          dc.SetBrush(wx.Brush(colour = wx.RED, style = wx.SOLID))
          dc.DrawRectangle(200, 100, 30, 30)


if __name__ == "__main__":
     app = wx.App()
     UmlD()
     app.MainLoop()
Habe folgendes problem, möchte mit dem button mit der id=13 rechtecke zeichnen, wenn ich jetzt auf den button klicke geschiet nichts, sobald ich das fenster minimiere und wieder maximiere erscheint erst das rechteck,
warum erscheint das rechteck nicht sobald ich drauf klicke??Wo mache ich ein fehler?
würde mich freuen wenn ihr mir behilflich sein würdet.

greetz
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

leute ich brauche eure hilfe, es ist sehr wichtig für mich!!!

greetz
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hi,

ich würde mir leichter tun, wenn der Code auch funktionieren würde (oder du ne Fehlermeldung postest, falls vorhanden). So könnte ich testen. Aber ich will jetzt nicht all die Icons irgendwoher zusammensuchen müssen, nur damit ich mir ansehe, warum das (Re)Drawing hier nicht funktioniert.

http://www.tty1.net/smart-questions_de.html#urgent

Schon hier gekuckt?
http://wiki.wxpython.org/AnotherTutorial
http://zetcode.com/wxpython/

Hast du eine Vermutung, warum es nicht läuft?
Gruß!
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo,

probiers mal mit Freeze() und Thaw(). Damit frierst du dein Fenster bzw. Panel vorm zeichnen ein und zeichnest, danach machst du es mit Thaw() wieder zugänglich.

Grüße
Martin
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

füg mal ein self.panel.Refresh() nach dem Zeichnen ein
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

danke für eure antworten

@C4S3
der zeichnet erst nach dem ich es minimiere und wieder maximiere.

ich habe alle möglichen sachen ausprobiert.

Das programm will einfach nicht nach einem button klick zeichnen.

Ich habe den ganzen ordner hochgeladen
der reagiert erst nach dem ich es minimiere und wieder maximiere.
habe das programm inkl. icons hochgeladen
http://rapidshare.com/files/186241363/diagramm.rar.html

@martin
hier zeichnet er auch nicht sofort, erst nach einem minimieren maximieren der fenster.


@DatenMetzger
habe es ausprobiert, der zeichnet wieder nicht nach em klicck, nachdem minimieren maximieren,zeichnet der erst aber die zeichnung flackert diesmal!!!
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Also, nur mal so nebenbei:
irgendwo hier gibt es nen Thread wo's um Hausaufgaben geht. Wenn ich das Problem jetzt löse, bekomme ich dann den "Bachelor"-Titel? ;)
Ne, nix für ungut.

Was mir aufgefallen ist: ich musste den Sourcecode ziemlich viel nacheditieren, da die Einrückung bei mir mit DrPython vermüllt war. Ging es nur mir so, oder hat sonst noch jemand das Problem?

Ich habe meine Links von Oben nochmals gelesen und bin zum einen über wx.FutureCall(..) gestoßen, was mir andere (aber nicht befriedigende) Ergebnisse mit deinem Programm brachte und über OnPaint()
C4S3 hat geschrieben:Schon hier gekuckt?
http://zetcode.com/wxpython/
Wenn ich OnPaint() definiere, und dann zeichnenn(...) einfüge, bekomme ich das Rechteck sofort. Nur es flackert (weil es ja bei jedem Refresh neu gezeichnet wird) und Toolbar will nun nicht mehr angezeigt werden.

Ehrlich gesagt bin ich also überfragt, aber vielleicht fällt ja jemand anderes noch was ein, oder die Sache mit dem OnPaint() hilft dir vielleicht weiter.

Viel Glück. Ich kram jetzt mal wxPython in Action wieder raus, vielleicht werde ich dann schlauer.
Gruß!
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

DatenMetzger hat schon recht. Wenn du deine Funktion zeichnenn änderst klappts... zumindest bei mir

Code: Alles auswählen

     def zeichnenn(self,event):
          wx.EVT_PAINT(self.panel, self.zeichnen)
          self.panel.Refresh()
@C4S3
nacheditieren musste ich nichts.Habs mit Editra und mit UltraEdit offen gehabt - nur die ganzen leerzeilen nerven ein wenig :roll:
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Yep. Bei mir funktioniert's auch.
Nur das flackern gefällt mir nicht. Bei keiner der wxDemos habe ich so ein Flackern gesehen. Hm..... :roll:
Gruß!
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

also ein Flackern habe ich bei mir nicht. Lediglich wenn ich auch noch einen Refresh in der Methode 'zeichnen' mir einbaue... woher das kommt weiss ich auch net - so genau kenne ich mich auch nich mit wx aus.
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

danke für die antworten, es klappt. flackert auch nicht. Habe das refresh() nur an einer falschen stelle eingesetzt.
Danke für eure hilfe

greetz
Antworten