[Gelöst] Fenster Inhalt komplett refreshen/repainten?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi,

mit welcher Methode kann ich einen Kompleten Fensterinhalt neu repainten bzw. refreshen (gemeint ist das sich der Fensterinhalt noch mal neu von Windows "gezeichnet" wird) ?

Helfen würde mir bei meinen Problem auch wenn es eine Möglichkeit gibt direkt aus einer Methode Heraus ein EVENT zu senden. Wenn ich das event wx.EVT_SIZE direkt senden könnte dann könnte ich mein Problem auch lösen. Am liebsten wäre mir aber wenn ich direkt das fenster Repainten könnt :)

Wozu das ganze? Ja das Problem ist wenn ich ein Frame von wx.SashLayoutWindow erzeuge und es in der __init__ Methode erzeuge dann wird es normal angezeigt/aufgebaut was ja so soll. Aber

…So nun habe ich ein Menü gebaut mit dem Menüpunkt Datei erzeugen. Wenn ich jetzt darauf drücke wird ja ein Event vom Typ wx.EVT_MENU ausgelöst. Soweit so gut. Nach dem auslösen wird die dafür zuständige Methode aufgerufen. IN dieser Methode wird nun Das Frame vom Typ wx.SashLayoutWindow erzeugt, statt in der _init_ methode ^^ Das Problem dabei ist das danach das erzeugte Frame nicht richtig angezeigt wird, sondern erst wenn ich die Fenster Größe ändere (zb. Maximieren, Minimieren & danach Maximieren oder per hand verändern). Da ist natürlich blöd und nicht gerade Professionell ^^

Aus diesem Grund brauche ich eine Methode mit den man das komplete Fenster repainten bzw. refreshen kann.

Was ich bisher probiert habe:
  • Die Methode Refresh
  • Das style wx.FULL_REPAINT_ON_RESIZE (was ja logischer weise nichts bringt weil es nur bei einem rezize bzw. ändern der Fenstergröße ausgelöst wird)
  • google
  • wx Doku (die nicht besonders gut ist)
  • Alle möglichen demos vom demofile angeschaut (war leider nichts dabei)
  • Den Code mehrmals umgeschrieben was aber nichts gebracht hat…
lg
Zuletzt geändert von sape am Mittwoch 27. September 2006, 20:59, insgesamt 2-mal geändert.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo,

Ferndiagnose ohne kompletten Sample Code ist nicht so leicht (zumindest nicht für mich).

Wo rufst Du die Refresh Methode auf? im __init__ Bereich? Das funktioniert
(manchmal) nicht so richtig, habe ich schon bemerkt, und ich weiss auch nicht warum, wahrscheinlich wenn Sizer verwendet werden.

Hast Du schon mal probiert in der Art:
wx.CallAfter (self.Refresh)
?

(Gerold hat vielleicht eine bessere Lösung :) )
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi :)

Mit wx.CallAfter geht es leider auch nicht :/ Langsam glaube ich das ich da ein Bug habe :( Obwohl ich ahb eigentlich alles richtig gemacht. Hab mich an eine Demo gehalten (mehr oder weniger) und danach einige anpassungen…

Hmm ja das mit dem Sample Code könnte ein wenig schwierig werden weil ich es erstmal aufs Minimum kürzen muss (werde ich später mal machen).

Die refresh-methode hatte ich in der gleichen Methode aufgerufen die nach dem Event wx.EVT_MENU aufgerufen wird.

Die methode die duchs event aufgerufen wurde sieht so aus. Die Klasse LayoutWindow ist dafür zuständig halt 2 Frames vom Typ wx.SashLayoutWindow zu erzeugen.
In dem Beispiel werde erstmal 2 Frames erzeugt (self.mainLayoutWindow) und dann im Ersten Frame (self.mainLayoutWindow.leftWindow) wider 2 Frames. :)

Code: Alles auswählen

def OnFileItem_fileMenu(self, event):
        # Haupt Layout Windows Erzeugen.
        #print self.parent
        self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER) 
        self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow, 
                                                     wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
        self.mainLayoutWindow_secLeft.Refresh()
        event.Skip()
Das merkwürdige ist halt sobald ich die LayoutWindow Klass zum Iinstanzieren in der __init__-methode vom MainFram (Also die Hauptklasse die erzeugt wird) benutze, werden die Frames sauber ohne Fehler aufgebaut. Sobald ich das aber in die Obere Methode OnFileItem_fileMenu packe und es durch das event wx.EVT_MENU aufrufen lasse (also wenn ich in dem Menü meines programs "NEue Datei" klicke das ein wx.EVT_MENU Event auslööst) geht es nicht. Dann muss ich praktisch, wie oben beschriebe, die Fenstergröße per hand oder Maximieren verändern und dann wird der Fensterinhalt halt Refrehst.

Ich weiß mittlerweile auch woran das liegt:
Und zwar befindet sich in der Klasse LayoutWindow am ende der __init__-methode ein biding…

Code: Alles auswählen

self.Bind(wx.EVT_SIZE, self.OnSize)
Nach dem die Klasse erfolgreich Instanziert wurde (In de __init__-Methode von MainFrame.) wird anscheinend vom MainFrame ein wx.EVT_SIZE Event ausgelösst das die OnSize Methode aufruft:

Code: Alles auswählen

def OnSize(self, event):
        wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow)
        print "Debug: OnSize"
        event.Skip()
Die sorge dafür dass das alles reprintet wird bzw. das Fenster ohne fehler aufgebaut wird (Weis leider nicht wx.LayoutAlgorithm().LayoutWindow() ganz genau macht ^^ XD hab das aus der Demo ^^). Genau das soll auch passieren!! Das Problem ist halt das das event wx.EVT_SIZE nicht aufgerufen wird wenn ich LayoutWindow in der Methode OnFileItem_fileMenu von MainFrame Instanziere ^^

Daher brauche ich ne Methode die entwerder in der lage ist das fenster zu reprinten/refreshen oder selber ein Event senden kann :) Wen das geht dann kann ich in OnFileItem_fileMenu danach selber das event wx.EVT_SIZE senden. Nur brauche ich erstmal ne Msthode die das kann :(

lg

P.S.: Ich schreibe nacher mal das ganze Script hier rein.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script by XtraNine
import sys

import wx
from wx.lib.splitter import MultiSplitterWindow


def create(parent, __DEBUG=False):
    return MainFrame(parent, __DEBUG)

wxID_MAINFRAME = wx.NewId()

class LayoutWindow (wx.Panel):
    
    def __init__(self, parent, Orientation, sashSize, style):
        wx.Panel.__init__(self, parent, style=style|wx.FULL_REPAINT_ON_RESIZE)

        self.ID_WINDOW_TOP    = wx.NewId()  # ID reserviert. Wird momentan nicht gebraucht. 
        self.ID_WINDOW_LEFT1  = wx.NewId()
        self.ID_WINDOW_RIGHT1 = wx.NewId()
        self.ID_WINDOW_BOTTOM = wx.NewId()  # ID reserviert. Wird momentan nicht gebraucht. 
        
        # wx.LAYOUT_HORIZONTAL or wx.LAYOUT_VERTICAL
        self.Orientation = Orientation
        
        if  Orientation == wx.LAYOUT_HORIZONTAL:
            self.wxSize = wx.Size(1000, sashSize) # 30
            self.leftWindow_SetAlignment   = wx.LAYOUT_TOP
            self.leftWindow_SetSashVisible = wx.SASH_BOTTOM
            self.rightWindow_SetAlignment   = wx.SASH_BOTTOM
            self.rightWindow_SetSashVisible = wx.LAYOUT_TOP
        else:
            self.wxSize = (sashSize, 1000) # 220
            self.leftWindow_SetAlignment = wx.LAYOUT_LEFT
            self.leftWindow_SetSashVisible = wx.SASH_RIGHT
            self.rightWindow_SetAlignment = wx.SASH_RIGHT
            self.rightWindow_SetSashVisible = wx.LAYOUT_LEFT
        
        
        # Fenster Links
        self.leftWindow = wx.SashLayoutWindow(self, self.ID_WINDOW_LEFT1, wx.DefaultPosition,
                                                wx.Size(200, 1000), wx.NO_BORDER |
                                                wx.SW_3D | wx.CLIP_CHILDREN)
        
        self.leftWindow.SetDefaultSize(self.wxSize)
        self.leftWindow.SetOrientation(Orientation)
        self.leftWindow.SetAlignment(self.leftWindow_SetAlignment)
        self.leftWindow.SetSashVisible(self.leftWindow_SetSashVisible, True)
        self.leftWindow.SetExtraBorderSize(10)

        # Fenster Rechts
        self.rightWindow = wx.SashLayoutWindow(self, self.ID_WINDOW_RIGHT1, wx.DefaultPosition,
                                                wx.Size(200, 1000), wx.NO_BORDER |
                                                wx.SW_3D | wx.CLIP_CHILDREN)

        self.rightWindow.SetDefaultSize(self.wxSize)        
        self.rightWindow.SetOrientation(Orientation)
        self.rightWindow.SetAlignment(self.rightWindow_SetAlignment)
        self.rightWindow.SetSashVisible(self.rightWindow_SetSashVisible, True)        
        self.rightWindow.SetExtraBorderSize(10)

        # Bindings
        self.leftWindow.Bind(wx.EVT_SASH_DRAGGED_RANGE, self.OnFoldPanelBarDrag,
                               id=self.ID_WINDOW_TOP, id2=self.ID_WINDOW_BOTTOM)
        self.Bind(wx.EVT_SIZE, self.OnSize) 
        
    def OnFoldPanelBarDrag(self, event):
        if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
            return

        if event.GetId() == self.ID_WINDOW_LEFT1:
            if  self.Orientation != wx.LAYOUT_HORIZONTAL:
                self.leftWindow.SetDefaultSize(wx.Size(event.GetDragRect().width, 1000))
            else:
                self.leftWindow.SetDefaultSize((1000, event.GetDragRect().height))
            print "Debug: LayoutWindow->OnFoldPanelBarDrag()"
            
        # Refreshen
        wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow)
        self.rightWindow.Refresh()

        event.Skip()
        
    def OnSize(self, event):
        wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow)
        print "Debug: LayoutWindow->OnSize()"
        event.Skip()

    def GetIDs (self):
        return "self.ID_WINDOW_TOP = %d | self.ID_WINDOW_LEFT1 = %d | " \
               "self.ID_WINDOW_RIGHT1 = %d  | self.ID_WINDOW_BOTTOM = %d" %(self.ID_WINDOW_TOP,
                                                                            self.ID_WINDOW_LEFT1,
                                                                            self.ID_WINDOW_RIGHT1,
                                                                            self.ID_WINDOW_BOTTOM)
                                                                          

        
#------------------------------------------------------------------------------#


class MainFrame(wx.Frame):
    
    def __PrintIDs (self):
        if self.__DEBUG == True:
           print "MainFrame:" \
           "wxID_MAINFRAME = %d | self.wxID_HELPITEM_HELP %d | self.wxID_FILEITEM_FILE = %d | " \
           "wxID_STATUSBAR1 = %d"  %(
             
            wxID_MAINFRAME,
            self.wxID_HELPITEM_HELP,
            self.wxID_FILEITEM_FILE,
            self.wxID_STATUSBAR1)
           
           print "LayoutWindow (self.mainLayoutWindow): ", self.mainLayoutWindow.GetIDs()
          
    def __init_MenuBar (self):
        # IDs erzeugen.
        self.wxID_HELPITEM_HELP  = wx.NewId()
        self.wxID_FILEITEM_FILE  = wx.NewId()
        self.wxID_FILEITEM_CLOSE = wx.NewId()
        
        # Menübar und die einzelnen Menüs "erzeugen".
        self.File = wx.Menu(title=u'')
        self.Help = wx.Menu(title=u'')
        self.menuBar1 = wx.MenuBar()
        
        # Mnüabschnite für self.File hinzufügen
        self.File.Append(help=u'Neues Projekt erzeugen', id=self.wxID_FILEITEM_FILE,
              kind=wx.ITEM_NORMAL, text=u'&Neue Datei')
        self.File.Append(help=u'Projekt schließen', id=self.wxID_FILEITEM_CLOSE,
              kind=wx.ITEM_NORMAL, text=u'&Datei schließen')
        
        self.Bind(wx.EVT_MENU, self.OnFileItem_fileMenu,
              id=self.wxID_FILEITEM_FILE)
        self.Bind(wx.EVT_MENU, self.OnCloseItem_fileMenu,
              id=self.wxID_FILEITEM_CLOSE)
        
        
        # Mnüabschnite für self.Help hinzufügen
        self.Help.Append(help=u'Hilfe anzeigen', id=self.wxID_HELPITEM_HELP,
              kind=wx.ITEM_NORMAL, text=u'Hilfe')
        
        self.Bind(wx.EVT_MENU, self.OnHelpItem_helpMenu,
              id=self.wxID_HELPITEM_HELP)

        # Menüs zum Menübar hinzufügen
        self.menuBar1.Append(menu=self.File, title=u'Datei')
        self.menuBar1.Append(menu=self.Help, title=u'Hilfe')
        
        # Menü erzeugen
        self.SetMenuBar(self.menuBar1)
    
    def __init_StatusBar (self):
        self.wxID_STATUSBAR1 = wx.NewId()
        self.statusBar1 = wx.StatusBar(id=self.wxID_STATUSBAR1,
              name='statusBar1', parent=self, style=0)
        
        self.statusBar1.SetFieldsCount(1)
        self.statusBar1.SetStatusText(number=0, text=u'')
        self.statusBar1.SetStatusWidths([-1])
        self.SetStatusBar(self.statusBar1) 
      
    def __init__(self, prnt, __DEBUG):
        self.__DEBUG = __DEBUG
        # Main Frame erzeugen.
        wx.Frame.__init__(self, id=wxID_MAINFRAME, name='', parent=prnt,
              pos=wx.Point(368, 256), size=wx.Size(800, 600),
              style=wx.DEFAULT_FRAME_STYLE, title='xpg 0.01')

        # Menü erzeugen.
        self.__init_MenuBar()
        
        # Statuszeile erzeugen.
        self.__init_StatusBar()
                
        #self.__PrintIDs()
        
#===============================================================================
#        self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER)
#        self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow, 
#                                                     wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
#    
#===============================================================================
        
    #
    # fileMenu
    #
    def OnFileItem_fileMenu(self, event):
        # Haupt Layout Windows Erzeugen.
        #print self.parent
        self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER) 
        self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow, 
                                                     wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
        event.Skip()
        
    def OnCloseItem_fileMenu(self, event):
        event.Skip()
    
    #
    # helpMenu
    #    
    def OnHelpItem_helpMenu(self, event):
        event.Skip()


class App(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        self.main = create(None, True)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = App(0)
    application.MainLoop()

if __name__ == '__main__':
   main()

Sorry falls die Erklärung jetzt zu Lange ausfällt, aber ich will bis her den Stand der dinge genau schildern damit ihr nicht lange suche müsst und mich nicht auf dinge hinweißt müsst die ich bereits entdeckt habe :)

Ok dan fange ich mal an:

So bei Zeile 166 ist ja die __init_-Methode von MainFrame.
Wenn man jetzt Zeilen 182, 183 und 184 auskommentiert und das Programm startet, werden die Frames von vom Type wx.SashLayoutWindow korrekt aufgebaut und angezeigt.

Das sieht da so aus:
Bild


Nun wider die Zeilen 182, 183 und 184 mit einen # kommentieren (ganz Wichtig!!)
Danach das Programm wider starten und dann auf Datei/Neue Datei klicken:
Danach sieht das so aus:
Bild

Wie man im roten kreis erkennen kann wurde das nicht richtig aufgebaut. So wenn man jetzt ABER das Fenster Maximiert oder per hand die Fenster Größe verstellt, sieht es aber aus wie im ersten Bild. Es wird dann also ein entsprechendes Event gesendet vom Type wx.EVT_SASH_DRAGGED_RANGE das die Methode in Zeile 70 aufruft. Da die Methode in Zeile 70 ein rezize macht ( Zeile 76 bzw. 78 ) wird dann ein Event vom Type wx.EVT_SIZE gesendet (logisch ^^) was dann die Methode in Zeile 87 aufruft. Die Methode in Zeile 87 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!

Wie bereits in den obigen posts erwähnt wird die Methode in Zeil 87 auch aufgeruffen wenn ich LayoutWindow in Zeile 182 Instanziere. Es muss wohl so sein das in der _init_-methode von MainFRame dan wohl auch ein Event vom Type wx.EVT_SIZE gesendent wird (?)
Die bleibt aber aus wenn ich das ganze halt in Zeile 194 mache :(

So nun seit ihr Profies dran. Woran könnte das liegen? Habe ich doch vielleicht ein Bug in der Klasse LayoutWindow?

Liebe Grüße und schon mal danke im voraus
xtranine

edit: "Die Methode in Zeile 78 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!" in "Die Methode in Zeile 87 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!" geändert.

Hatte mich verschrieben :D
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hat doch nichts mit wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow) zu tun…hab das mal direkt aufgerufen und dan findet kei refresh stat eigenartig :?

naja dann kann ich wohl den code in die tone kloppen :( Hab mich eigentlich an alles gehalten und verstehe nicht weshalb der gehler zu stande kommt…

edit:
Ich hab das jetzt so gelöst in dem ich in der OnFileItem_fileMenu Methode am ende…

Code: Alles auswählen

size = self.GetSize()
self.SetSize (wx.Size(size[0]+1,size[1]+1))
self.SetSize (size)
… geschrieben habe. Das Fenster wird kurz resized und dann wider auf die ursprüngliche Größe resized. Nicht die beste Lösung oder :cry: ...

lg

EDIT: Falls einer weis wo da der Fehler liegt bitte bescheid sagen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi, wollte euch mal auf den laufenden halten (mir ist gerade ne Idee gekommen ^^). Ich probiere das gerade mit MultiSplitterWindow aus. Also ich mache damit jetzt 2 ""Frames"". Wenn die Klasse fertig ist werde ich damit probieren das außerhalb einer __init__methode zu erzeugen. Wenn ich dann auf das GLEICHE Problem stoße, möchte ich gerne mit euch darüber Diskutieren/Vermutungen anstellen woran es im Prinzip liegen könnte das Frames, etc nur innerhalb einer __init__-Methode aufgebaut werden können….

Jetzt ist es ein wenig spät dafür deshalb morgen mehr ;)

lg

P.S: Ich hoffe das Doppelposts hier im Forum nicht schlimm sind :) Wenn ja dann bitte drauf hinweisen.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

habe momentan gerade keine python installation zur hand... Guck dir mal die Sizers an. Die organisieren dir alles neu wenn die fenster grösse geändert wird.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ne das geht nicht um Fenstergröße ändern. Es geht darum das man z.B. SplitterWIndow und wx.SashLayoutWindow auserhalb der __init__-Methode erzeigen kann weil es dann nicht richtig angezeigt wird bis man Manuel die Fenstergröße einstellt. Wie gesagt das betrifft nur SplitterWindow und SashLayoutWindow. Bei textCtrl geht es zum Beispiel...ich werde mal dazu eine separaten thread aufmachen mit Beispielen, weil es hier nicht zum Topic gehört. Ich glaube mittlerweile das bisher keinem das Problem aufgefallen ist weil zu 99,9% die User diese beiden Sachen in der __init__ aufbauen...

lg
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Sorry, habe nur Bruchstücke des Threads gelesen, aber wenn ich bei der Funktion ein Size Event schicke, scheint es zu funktionieren.

Code: Alles auswählen

   def OnFileItem_fileMenu(self, event):
        # Haupt Layout Windows Erzeugen.
        #print self.parent
        self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER)
        self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow,
                                                     wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
        event.Skip()
        #hier size event schicken
        event = wx.SizeEvent()
        self.GetEventHandler().ProcessEvent(event)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi danke dir :) Werde es aber erst Heute Abend oder frühestens morgen testen können.

LG XtraNine
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Sorry das ich mich jetzt erst melde. Wahr ein wenig im Stress.

Hatte den Code ausprobiert und es funktionierte auch nicht. (hab aber mittlerweile auch alles geändert und hab mir jetzt ne Klasse, basisierend auf SplitterWindow, gebaut, da ich mit LayoutWindow und MultiSplitterWindow heftige Probleme hatte mit flackernden Bildschirm wenn ich die Fenstergröße Manuel ändere. Konnte das leider auch nicht beheben, auch nicht mit wx.NO_FULL_REPAINT_ON_RESIZE, da ja ein resize erforderlich ist um das Fenster aufzubauen (z.B. --> wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow); self.rightWindow.Refresh() ) könnte woll daher kommen das es nicht funktioniert)

Naja egal nun hab ich ne Vernünftige Klasse die auch Konsistenter ist. Ich muss zwar jetzt viel mit Sizern arbeiten aber das geht schon. ;) Dafür konnte ich an anderen stellen Code einsparen was sich dann fast aufhebt.

Das Problem mit den nicht aufbauen außerhalb der _init_ konnte ich nu durch diesen Code am ende beheben :)
self.SetClientSize(self.GetSize())
Damit geht es nun und das ist die Hauptsache.

Ich möchte mich noch mal bei allen bedanken die sich die Zeit genommen haben mir bei meinen Problem zu Helfen. :)

Liebe grüße
xtra
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Ja, schön.

Leider haben, wie ich gesehen habe, nicht viele Leute darauf geantwortet.
Ich hoffe, ich langweile nicht, da ich das schon öfters geschrieben habe, aber:

Das Problem war spezieller und da ist es besser, die Mailing List zu abbonieren. Auch im Wiki gibt es interessante Dinge zu entdecken.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Um mal bei deinem Tenor zu bleiben: Ja, schön ^^…

Kennst du eine gute deutsch mailingliste?

lg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

XtraNine hat geschrieben:Kennst du eine gute deutsch mailingliste?
Ich glaube nicht, dass es eine deutsche Mailingliste gibt, dafür ist die Zielgruppe einfach zu klein. Aber defür gibt es gute englische Mailinglisten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten