Partage
  • Partager sur Facebook
  • Partager sur Twitter

[wx] Créer un wx.HyperlinkCtrl vide ?

    26 novembre 2010 à 22:43:42

    Bonsoir!

    Voilà je voulais demander comment faire pour créer un layout wx.HyperlinkCtrl() mais vide de base, puis le changer à un certain moment (wx.EVT_BUTTON sur un autre bouton) ? Je sais pas si c'est possible de créer d'abord un wx.TextCtrl() puis changer le mode et les attributs ...

    Mon code si ça peut aider :
    import os
    import wx
    import sys
    import time
    import urllib
    
    TEMP_FILENAME = "temp.data"
    SCRN_FILENAME = "temp.png"
    
    def uploadScreen(filepath):
    	os.system("curl -H Expect: -F fileupload=\"@" + filepath + "\" -F xml=yes -# \"http://www.imageshack.us/index.php\" > " + TEMP_FILENAME)
    	with open(TEMP_FILENAME, "r") as file:
    		content = file.read()
    	start = content.find("<image_link>")
    	end = content.find("</image_link>")
    	link = content[start+12:end]
    	os.remove(TEMP_FILENAME)
    	os.remove(SCRN_FILENAME)
    	return link
    	
    def shorten_url(url):
    	try:
    		return urllib.urlopen("http://is.gd/api.php?longurl=%s" % url).read()
    	except:
    		return ''
    	
    class MyFrame(wx.Frame):
    	def __init__(self):
    		wx.Frame.__init__(self, None, wx.ID_ANY, "Easy screenshot uploader - by FMIS@Menace.", size=(390, 100))
    		
    		self.panel = wx.Panel(self, wx.ID_ANY)
    		self.button = wx.Button(self.panel, wx.ID_ANY, "Take Screenshot", size=(350, -1))
    		self.button.Bind(wx.EVT_BUTTON, self.onTakeScreenshot)
    		self.urlText = wx.TextCtrl(self.panel, wx.ID_ANY, style=wx.TE_READONLY, size=(350, -1))
     
    		self.sizer = wx.BoxSizer(wx.VERTICAL)
    		self.sizer.Add(self.button, 0, wx.ALIGN_CENTER | wx.ALL, 3)
    		self.sizer.Add(self.urlText, 0, wx.ALIGN_CENTER | wx.ALL, 3)
    		self.panel.SetSizer(self.sizer)
    		
    	def onTakeScreenshot(self, event):
    		self.Show(False)
    		time.sleep(0.5)
    		dcScreen = wx.ScreenDC()
    		memDC = wx.MemoryDC()
    		x, y = wx.DisplaySize()
    		bmp = wx.EmptyBitmap(x, y)
    		memDC.SelectObject(bmp)
    		memDC.Blit(0, 0, x, y, dcScreen, 0, 0)
    		memDC.SelectObject(wx.NullBitmap)
    		img = bmp.ConvertToImage()
    		img.SaveFile(SCRN_FILENAME, wx.BITMAP_TYPE_PNG)
    		link = uploadScreen(os.getcwd() + os.sep + SCRN_FILENAME)
    		if not len(link):
    			wx.MessageDialog(None, "It looks you have not installed cURL\nCheck http://www.paehl.com/open_source/?CURL_7.21.2 !", "Easy Screenshot Uploader - Error", wx.OK | wx.ICON_HAND).ShowModal()
    		if not link.startswitch('http'):
    			wx.MessageDialog(None, "Server didn't respond in time - Get a better connection and try again!", "Easy Screenshot Uploader - Error", wx.OK | wx.ICON_HAND).ShowModal()
    		short_link = shorten_url(link)
    		if not len(short_link):
    			short_link = link
    		self.urlText.SetLabel(short_link)
    		self.Show(True)
    		
    myApp = wx.App(False)
    myFrame = MyFrame()
    myFrame.Show()
    myApp.MainLoop()
    


    Merci d'avance, FMIS@Menace.
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2010 à 0:39:31

      Bonsoir,
      Je ne suis pas sûr de comprendre exactement ce que tu veux faire. Si tu veux afficher un lien dans ta fenêtre, à quoi sert le wx.TextCtrl?
      Si tu veux un wx.HyperlinkCtrl vide, il suufit de ne pas mettre de label ni d'url:

      self.urlText = wx.HyperlinkCtrl(self.panel, wx.ID_ANY, "", "")
      


      tu peux ensuite les modifier comme ceci:
      self.urlText.SetLabel("site du zero")
      self.urlText.SetURL("http://www.siteduzero.com")
      


      Mais bon, je suis pas sûr d'avoir répondu à la question.

      Juste une petite remarque concernant ta mise en page. Si tu veux que ton bouton fasse la longueur de la fenêtre, je te conseil plutôt d'utiliser wx.EXPAND, au lieu d'utiliser l'argument size. Tu peux utiliser wx.RIGHT et wx.LEFT, si tu souhaites avoir des marges:

      self.button = wx.Button(self.panel, wx.ID_ANY, "Take Screenshot")
      self.sizer.Add(self.button, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 20)
      

      Je trouve ça plus propre, et ça t'évite de refaire des calculs à chaque fois que tu veux changer la taille de ta fenêtre. Et ton bouton fera toujours la longueur de la fenêtre, même si l'utilisateur la redimensionne.
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2010 à 8:48:47

        Merci pour l'alignement, j'ai corrigé et en effet c'est plus propre.

        Par contre pour le HyperlinkCtrl, j'ai vu qu'il était obligé de spécifier un flag et une URL, c'est pour ça que ta méthode ne fonctionne pas (j'ai pensé à le faire de cette manière au début).

        Traceback (most recent call last):
          File "C:\Python26\test.py", line 65, in <module>
            myFrame = MyFrame()
          File "C:\Python26\test.py", line 34, in __init__
            self.urlText = wx.HyperlinkCtrl(self.panel, wx.ID_ANY, "", "", style=wx.TE_READONLY, size=(350, -1))
          File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 6632, in __init__
            _controls_.HyperlinkCtrl_swiginit(self,_controls_.new_HyperlinkCtrl(*args, **kwargs))
        PyAssertionError: C++ assertion "alignment == 1" failed at ..\..\src\generic\hyperlink.cpp(87) in wxHyperlinkCtrl::Create(): Specify exactly one align flag!
        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2010 à 12:23:45

          C'est bizarre chez moi ça n'a pas posé de problème (je suis sur ubuntu).
          ça marche lorsque tu mets une url et un alignement à l'instanciation?

          sinon tu peux créer ton HyperlinkCtrl lorsque tu souhaites afficher le lien.
          Si tu veux mettre un autre controle au démarrage, regarde du coté de Sizer.Replace(). Tu peux récupérer le sizer avec monCtrl.GetSizer().
          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2010 à 17:53:44

            Je ne vais pas l'instancier dans la méthode __init__, étant donné qu'il est censé être vide au début :(

            Par contre ton histoire de Sizer, malgré la doc, j'ai pas compris grand chose. Tu saurais me faire un exemple que je puisse adapter à mon code s'il te plaît?
            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2010 à 16:20:15

              Citation : FMIS@Menace.

              Je ne vais pas l'instancier dans la méthode __init__, étant donné qu'il est censé être vide au début



              Ba pourquoi pas. ça me parait plus simple à mettre en oeuvre. Mais peut être que quelque chose m'échappe. Je n'ai toujours pas compris pourquoi tu veux mettre un textCtrl au démarrage.
              Voici un exemple:

              import wx
              
              class MyFrame(wx.Frame):
                  def __init__(self):
                      wx.Frame.__init__(self, None, wx.ID_ANY, size=(390, 100))
                      self.button = wx.Button(self, wx.ID_ANY, "Take Screenshot", size=(350, -1))
                      self.urlText = wx.HyperlinkCtrl(self, wx.ID_ANY, "", "")
                      self.sizer = wx.BoxSizer(wx.VERTICAL)
                      self.sizer.Add(self.button, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 20)
                      self.sizer.Add(self.urlText, 0, wx.ALIGN_CENTER)
                      self.SetSizer(self.sizer)
                      
                      self.button.Bind(wx.EVT_BUTTON, self.showUrl)
                  
                  def showUrl(self, e):
                      self.urlText.SetLabel("site du zero")
                      self.urlText.SetURL("http://www.siteduzero.com")
                      self.Layout()
                      
              myApp = wx.App(False)
              myFrame = MyFrame()
              myFrame.Show()
              myApp.MainLoop()
              
              • Partager sur Facebook
              • Partager sur Twitter
                29 novembre 2010 à 17:36:14

                Je l'ai déja dit, cela provoque une erreur :(

                Traceback (most recent call last):
                  File "C:/Python26/test7.py", line 21, in <module>
                    myFrame = MyFrame()
                  File "C:/Python26/test7.py", line 7, in __init__
                    self.urlText = wx.HyperlinkCtrl(self, wx.ID_ANY, "", "")
                  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 6632, in __init__
                    _controls_.HyperlinkCtrl_swiginit(self,_controls_.new_HyperlinkCtrl(*args, **kwargs))
                PyAssertionError: C++ assertion "!url.empty() || !label.empty()" failed at ..\..\src\generic\hyperlink.cpp(80) in wxHyperlinkCtrl::Create(): Both URL and label are empty ?
                • Partager sur Facebook
                • Partager sur Twitter
                  29 novembre 2010 à 18:28:15

                  Ha oui, j'avais oublié.
                  Peut-être quelque chose dans le genre alors:

                  import wx
                  
                  class MyFrame(wx.Frame):
                      def __init__(self):
                          wx.Frame.__init__(self, None, wx.ID_ANY, size=(390, 100))
                          self.hyperLinkIsShow = False
                          self.button = wx.Button(self, wx.ID_ANY, "Take Screenshot", size=(350, -1))
                          self.textStart = wx.StaticText(self, wx.ID_ANY, "pas de lien")
                          
                          self.sizer = wx.BoxSizer(wx.VERTICAL)
                          self.sizer.Add(self.button, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 20)
                          self.sizer.Add(self.textStart, 0, wx.ALIGN_CENTER)
                          self.SetSizer(self.sizer)
                          
                          self.button.Bind(wx.EVT_BUTTON, self.showUrl)
                      
                      def showUrl(self, e):
                          if self.hyperLinkIsShow:
                              self.urlText.SetLabel("site du zero")
                              self.urlText.SetURL("http://www.siteduzero.com")
                          else:
                              self.urlText = wx.HyperlinkCtrl(self, wx.ID_ANY, "site du zero", "http://www.siteduzero.com")
                              self.sizer.Replace(self.textStart, self.urlText)
                              self.hyperLinkIsShow = True
                          self.Layout()
                          
                  myApp = wx.App(False)
                  myFrame = MyFrame()
                  myFrame.Show()
                  myApp.MainLoop()
                  


                  Tu peux mettre aussi une adresse fictive au démarrage et cacher le contrôle.

                  import wx
                  
                  class MyFrame(wx.Frame):
                      def __init__(self):
                          wx.Frame.__init__(self, None, wx.ID_ANY, size=(390, 100))
                          self.button = wx.Button(self, wx.ID_ANY, "Take Screenshot", size=(350, -1))
                          self.urlText = wx.HyperlinkCtrl(self, wx.ID_ANY, "rien", "http://rien.com")
                          self.urlText.Hide()
                          self.sizer = wx.BoxSizer(wx.VERTICAL)
                          self.sizer.Add(self.button, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, 20)
                          self.sizer.Add(self.urlText, 0, wx.ALIGN_CENTER)
                          self.SetSizer(self.sizer)
                          
                          self.button.Bind(wx.EVT_BUTTON, self.showUrl)
                      
                      def showUrl(self, e):
                          self.urlText.SetLabel("site du zero")
                          self.urlText.SetURL("http://www.siteduzero.com")
                          if not self.urlText.IsShown():
                              self.urlText.Show()
                          
                          self.Layout()
                          
                  myApp = wx.App(False)
                  myFrame = MyFrame()
                  myFrame.Show()
                  myApp.MainLoop()
                  
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [wx] Créer un wx.HyperlinkCtrl vide ?

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown