wxDC mit XRC panel

Plattformunabhängige GUIs mit wxWidgets.
Antworten
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

Mittwoch 11. Mai 2005, 13:51

Hi
hab da folgendes Problem. ich habe ein Gui mit dem xrc-Editor erstellt und nun versuche ich, auf dem Panel einen Strich zu zeichnen. Jedoch geschieht nichts. Habe im Forum gesucht, jedoch keine Lösung gefunden.

Code:

Code: Alles auswählen

def __init__(self,parent,drawFun):
       
        wx.Frame.__init__(self,parent,-1,"gehen",pos=(150,150),size=(515, 350))
        #Load the sourcefile
        res = xrc.XmlResource("dialog.xrc") 
        #Create the panel from the resource data
        panel = res.LoadPanel(self,"Haupt")
        #Import the menu bar from xml
        menu = res.LoadMenuBarOnFrame(self,"MENUBAR")
        #Provide a statusbar to display information on menuitems
        statusbar = self.CreateStatusBar(style = wx.ST_SIZEGRIP)
        #Set standard text
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        
        self.SetStatusText("testtesttesttesttesttest")
        #Define Event Handlers for this class/resource
        EVT_MENU(self,XRCID("Exit"),self.TimeToLeave)
        EVT_MENU(self,XRCID("Neu"),self.OnAbout)
        EVT_MENU(self,XRCID("alueg"),self.OnAlueg)
        EVT_MENU(self,XRCID("versteck"),self.OnHighscore)
        #outgoing stats
        self.__StatAnzVersCtrl = XRCCTRL(panel,"AnzVers_out")
        self.__Combo = XRCCTRL(panel,"Combo_out")
        self.__ComboPoints = XRCCTRL(panel,"ComboPoints_out")
        self.__StatTotPtsCtrl = XRCCTRL(panel,"PointsTotal_out")
        self.memdc = wx.MemoryDC()
              
    def OnPaint(self,evt):
        dc = wx.PaintDC(panel)
        dc.DrawLine(50,50,150,150)

Ich hoffe, dass mir einer Helfen kann

Edit (Leonidas): Code in Python-Tags gesetzt.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 11. Mai 2005, 14:22

Hallo, leider kenne ich mich mit XRC und DC nicht so aus.

OnPaint wird ja aufgerufen (mit print statment vielleicht probieren)
Könntest du dann vielleicht probieren:
eine Pen setzten (DrawLine benötigt das)

Ich habe schnell was zusammengestellt, das zumindest beim mir funktioniert: wxPy 2.6, WinXP (ohne Pen zu setzen geht hier)

Code: Alles auswählen

import wx

class MyPanel(wx.Panel):
	def __init__(self, parent, id):
		wx.Panel.__init__(self, parent, id)
		self.Bind (wx.EVT_PAINT, self.OnPaint)
		
	def OnPaint(self,evt):
		dc = wx.PaintDC(self)
		dc.DrawLine(50,50,150,150) 

class MyFrame(wx.Frame):
	def __init__(self, parent, id, title):
		wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.DefaultSize, wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
		self.panel = MyPanel (self, -1)

class DrApp(wx.App):

	def OnInit(self):
		
		frame1 = MyFrame(None, 101, "MyFrame1")	
		frame1.Show(True)
		return True
	
if __name__ == '__main__':
	app = DrApp(0)
	app.MainLoop()

Edit (Leonidas): Code in Python-Tags gesetzt.
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

Mittwoch 11. Mai 2005, 14:35

Hi Francesco
thx für die schnelle Antwort


Also dein Beispiel funzt bei mir, jedoch wenn ich es mit dem xrc source mache, geschieht gar nichts. Und mit Pens hab ich es auch versucht.
Ich glaube, dass man bei xrc anderst zeichnen muss. Jedoch finde ich fast keine Infos im Inet dazu. Leider.
Bin grad an meiner Abschlussarbeit dran und muss es mit xrc machen...

das komische ist, dass onPaint mehrmals aufgerufen wird und dies sollte ja nicht so sein...
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 11. Mai 2005, 14:43

redeye hat geschrieben:Hi Francesco
thx für die schnelle Antwort
Bitte, leider kann ich dir da nicht weiterhelfen.

Wenn sonst keiner mehr antwortet:
Du könntest aber auch in der mailing list versuchen:
wxPython-users@lists.wxwindows.org

Threadübersicht:
http://lists.wxwidgets.org/cgi-bin/ezmlm-cgi/11

am bequemsten ist es aber über gmane newsserver.
redeye
User
Beiträge: 12
Registriert: Mittwoch 11. Mai 2005, 13:45

Mittwoch 11. Mai 2005, 15:48

SO HAB DIE LÖSUNG, NACH LANGEM STUDIEREN. HEHE

Code: Alles auswählen

import wx
import wx.xrc as xrc
import os
import random
import types
import pickle

#define Makros for XML Resources
XRCID = xrc.XRCID
XRCCTRL = xrc.XRCCTRL
EVT_MENU = wx.EVT_MENU
EVT_BUTTON = wx.EVT_BUTTON
EVT_TOGGLEBUTTON = wx.EVT_TOGGLEBUTTON
EVT_TEXT = wx.EVT_TEXT
               
class Frame_Game(wx.Frame):    
    def __init__(self,parent,aha):
       
        wx.Frame.__init__(self,parent,-1,"gehen",pos=(150,150),size=(515, 350))
        #Load the sourcefile
        res = xrc.XmlResource("dialog.xrc") 
        #Create the panel from the resource data
        self.panel = res.LoadPanel(self,"Haupt")
##        panel = MyPanel (self, -1)
        #Import the menu bar from xml
        menu = res.LoadMenuBarOnFrame(self,"MENUBAR")
        #Provide a statusbar to display information on menuitems
        statusbar = self.CreateStatusBar(style = wx.ST_SIZEGRIP)
        #Set standard text
        self.SetStatusText("testtesttesttesttesttest")
        #Define Event Handlers for this class/resource
        EVT_MENU(self,XRCID("Exit"),self.TimeToLeave)
        EVT_MENU(self,XRCID("Neu"),self.OnAbout)
        EVT_MENU(self,XRCID("alueg"),self.OnAlueg)
        EVT_MENU(self,XRCID("versteck"),self.OnHighscore)
        wx.EVT_PAINT(self,self.OnPaint)
##        self.Bind(wx.EVT_PAINT, self.OnPaint)
        #outgoing stats
     
    def OnPaint(self,evt): 
        dc = wx.PaintDC(self.panel) 
        dc.DrawLine(50,50,150,150) 
        dc.DrawCircle(250,150,50) 
        
    def TimeToLeave(self,evt):
        """Event handler for the close button."""
        self.List.WriteHs()
        self.Close()
          
    def OnAlueg(self,evt):
##        self.Nuenen(self.memdc)
        None
        
    def OnHighscore(self,evt):
        wx.MessageBox('haha','highscore')
##        self.List.zeigeListenelemente2a()
        
    def OnAbout(self,evt):
        wx.MessageBox("LeoYatzee 0.1a\n","About")
    
class App_game_main(wx.App):
    def OnInit(self):
        frame = Frame_Game(None, "test")
        #Do not allow to resize the windows
##        frame.SetWindowStyle(wx.DEFAULT_FRAME_STYLE& ~(wx.RESIZE_BORDER |
##            wx.RESIZE_BOX | wx.MAXIMIZE_BOX))
        self.SetTopWindow(frame)
        frame.Show(True)
        return True
            
app = App_game_main(redirect=True)
app.MainLoop()

    

   
edit: hab falschen Code gepostet. und vielen Dank an Francesco, du hast mir sehr geholfen...

das Problem war, dass man dem DCPaint das Handle vom panel übergeben muss, das ich allerdings übersehen habe...
Zuletzt geändert von redeye am Donnerstag 12. Mai 2005, 08:32, insgesamt 3-mal geändert.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 11. Mai 2005, 15:50

redeye hat geschrieben:Hi Francesco
Ich glaube, dass man bei xrc anderst zeichnen muss. Jedoch finde ich fast keine Infos im Inet dazu. Leider.
Bin grad an meiner Abschlussarbeit dran und muss es mit xrc machen...

Nachtrag (vielleicht hilfreich):

http://wiki.wxpython.org/index.cgi/UsingXmlResources
Olliminator

Dienstag 24. Mai 2005, 23:29

Wird die Grösse des Codes durch XRC auch kleiner wenn ich es zur .EXE compilire? Ich denk habe sowas auf einer anderen Seite gelesen.(weiss aber nicht mehr wo) Mein Englisch ist auch nicht das beste.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 28. Mai 2005, 06:10

Ich denke nicht, dass die paar Kilobyte die das XRC belegt irgendeinen Wert im Vergleich mit den Megabytemengen die py2exe ohnehin generiert hat.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Olliminatore

Samstag 28. Mai 2005, 15:01

Hmm ja scheint so. (wüsste jetzt auch nicht mehr wie das theoretisch funktionieren sollte).
Also so richtig habe ich das mit XRC nicht verstanden (if XML is good: then XRC is also good), denke mal ist für grössere/komplexere, weiterentwickelt werdende GUIs.

Aber ich hab in der Docu von wxWidgets gelesen das man sich eine eigene wx.DLL Compiliren kann mit nur den Funktionen die man benötigt.(wenn ich richtig gelesen habe, um Platz einzusparen). Das wiederum überschreitet meinen Horizont/Möglichkeiten.
Antworten