Link in MessageDialog?

Plattformunabhängige GUIs mit wxWidgets.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Mittwoch 25. Juli 2007, 08:40

Hallo,

stehe gerade vor einem Problem und hoffe, dass mir jemand auf die Sprünge helfen kann!?
Und zwar hab ich eine einfache DialogBox (wx.MessageDialog) mit ein paar Infos drin. Nun möchte ich gerne "Links" einfügen. Also wenn man auf so einen Link klickt, soll eine weitere DialogBox mit zusätzlichen Informationen erscheinen. Hab schon die wx Demo durchgeschaut aber nichts zum Thema gefunden?

Gruß
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 25. Juli 2007, 08:46

Hallo blubber!

Das kann wx.MessageDialog nicht. Du musst dir selber mit wx.Dialog einen Dialog erstellen. Dort kannst du dann auch wx.lib.hyperlink für die Links verwenden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Mittwoch 25. Juli 2007, 08:58

ok danke. Das ist ja blöd. Nagut, werd mal rumstöbern.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Mittwoch 25. Juli 2007, 12:53

steh grad irgendwie aufm Schlauch. Also: Ich ruf innerhalb der Classe A bei Betätigung eines Buttons eine Funktion X auf. In der Funktion X steht folgender Code:

Code: Alles auswählen

self.info = Info(self, -1, "This is a Dialog", size=(350, 200), 
                                style = wx.DEFAULT_DIALOG_STYLE)
self.info.CenterOnScreen()
Die Klasse "Info" befindet sich im gleichen Modul und enthält folgenden Code:

Code: Alles auswählen

class Info(wx.Dialog):
    def __init__(self, parent, ID, title, size=wx.DefaultSize, pos=wx.DefaultPosition, 
            style=wx.DEFAULT_DIALOG_STYLE
            ):        
        print "Initialisierung Info"
        
        pre = wx.PreDialog()
        pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
        pre.Create(parent, ID, title, pos, size, style)
        self.PostCreate(pre)
Ich bekomm aber eine Fehlermeldung, wenn ich dieses ausführe und weis nicht warum:
Type Error: argument number 2: a 'wxWindow *' is expected, ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 25. Juli 2007, 13:00

Du vergisst ja auch, Info.__init__ das `parent`-Argument mitzugeben.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Mittwoch 25. Juli 2007, 13:03

was muss man denn für parent übergeben? Weil ich hab das Beispiel aus der wx Demo und da wird auch kein parent übergeben!? Also ich seh jedenfalls mal net wie/wo...
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Freitag 27. Juli 2007, 13:19

weis das niemand, was man als parent übergeben muss/kann?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 27. Juli 2007, 14:16

Hallo blubber!

Vielleicht kannst du damit etwas anfangen:
http://www.python-forum.de/topic-11487.html

Im Beispiel verzichte ich aber auf das Fragezeichen in der Titelleiste. Das brauchte ich noch nie und deshalb weiß ich auch nicht ob es genügt, ``None`` als parent zu übergeben. Beim normalen Dialog wie auch beim Frame ist ``None`` erlaubt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Montag 30. Juli 2007, 08:20

Hallo Gerold,

danke für das Beispiel, funktioniert soweit sehr gut. Jetzt hab ich allerdings noch ein Problem, und zwar enthält mein eingefügter Text manchmal recht lange Zeilen. Nun macht er automatisch das Fenster so breit, wie die längste Zeile ist, was blöd ist, weil das Fenster dann ungefähr zwei Bildschirmbreiten hat :)
Kann man die maximale Größe des Fensters festlegen, damit er dann einfach automatisch Zeilenumbrüche macht?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 30. Juli 2007, 08:35

blubber hat geschrieben:Kann man die maximale Größe des Fensters festlegen, damit er dann einfach automatisch Zeilenumbrüche macht?
Hallo Blubber!

Man kann den Text umbrechen:

Code: Alles auswählen

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

import wx
from wx.lib.wordwrap import wordwrap

wx.SetDefaultPyEncoding("iso-8859-15")


class MyMessageDialog(wx.Dialog):
   
    def __init__(self, parent = None, title = "Example"):
        wx.Dialog.__init__(self, parent, -1, title)
       
        #...
        
        # Hinweistext
        message = (
            u"Das ist immer so eine Sache mit diesen Texten. Man weiß "
            u"nie was man so schreiben soll. Aber irgendwie möchte man "
            u"doch etwas an Text zusammen bekommen..."
        )
        message = wordwrap(message, 400, wx.ClientDC(self))
        
        lab_message = wx.StaticText(self, label = message)
        hbox_content.Add(lab_message, 1, wx.ALL, 5)
       
# ...
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Montag 30. Juli 2007, 13:23

hmm ok..plöd. Kann es sein, dass es wordwrap erst ab Python 2.5 gibt? Ich bekomm nämlich ne Fehlermeldung, dass es das Modul nicht gibt...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 30. Juli 2007, 13:34

blubber hat geschrieben:hmm ok..plöd. Kann es sein, dass es wordwrap erst ab Python 2.5 gibt?
Hallo blubber!

Hast du evt. diese Zeile übersehen?

Code: Alles auswählen

from wx.lib.wordwrap import wordwrap
Ansonsten gilt wie immer: Komplettes Traceback posten.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Montag 30. Juli 2007, 13:55

Hallo Gerold,

nein, ich habe den Import nicht vergessen, deshalb kam ich ja zu meiner Vermutung, weil die Fehlermeldung exakt auf die Zeile verweist, in der ich das Modul importieren möchte:

from wx.lib.wordwrap import wordwrap
ImportError: No module named wordwrap

Gruß
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 30. Juli 2007, 14:15

blubber hat geschrieben:ImportError: No module named wordwrap
Hallo blubber!

Hier ist der Quellcode von wordwrap.py:

Code: Alles auswählen

#----------------------------------------------------------------------
# Name:        wx.lib.wrap
# Purpose:     Contains a function to aid in word-wrapping some text
#
# Author:      Robin Dunn
#
# Created:     15-Oct-2006
# RCS-ID:      $Id: wordwrap.py,v 1.1 2006/10/16 19:49:38 RD Exp $
# Copyright:   (c) 2006 by Total Control Software
# Licence:     wxWindows license
#----------------------------------------------------------------------



def wordwrap(text, width, dc, breakLongWords=True):
    """
    Returns a copy of text with newline characters inserted where long
    lines should be broken such that they will fit within the given
    width, on the given `wx.DC` using its current font settings.  By
    default words that are wider than width will be broken at the
    nearest character boundary, but this can be disabled by passing
    ``False`` for the ``breakLongWords`` parameter.
    """

    wrapped_lines = []
    text = text.split('\n')
    for line in text:
        pte = dc.GetPartialTextExtents(line)
        idx = 0
        start = 0
        startIdx = 0
        spcIdx = -1
        while idx < len(pte):
            # remember the last seen space
            if line[idx] == ' ':                
                spcIdx = idx

            # have we reached the max width?
            if pte[idx] - start > width and (spcIdx != -1 or breakLongWords):
                if spcIdx != -1:
                    idx = spcIdx + 1
                wrapped_lines.append( line[startIdx : idx] )
                start = pte[idx]
                startIdx = idx
                spcIdx = -1

            idx += 1

        wrapped_lines.append( line[startIdx : idx] )

    return '\n'.join(wrapped_lines)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Montag 30. Juli 2007, 14:32

ok nun gehts. Vielen Dank.
Antworten