2010-05-25 7 views
0

J'ai une application sur laquelle je travaillais pour en savoir plus sur wxPython (j'ai été principalement un scripteur). Je l'ai oublié maintenant je l'ouvre de nouveau. C'est un grattoir d'écran, et je le fais fonctionner presque comme je le veux, en construisant un analyseur d'expressions rationnelles pour supprimer les liens de toutes les éraflures dont je n'ai pas besoin. Les questions que j'ai sont les suivantes. Dans son état actuel, si je vérifie plus d'un site, il sort et gratte, et le renvoie dans des fenêtres séparées, le pour: chaque section de la fonction Cliqué. Je veux les mettre dans un cadre, dans la fenêtre, tout à fait. Je veux également savoir si je peux prendre la liste dans laquelle ils sont lus et l'envoyer à une liste de contrôle, afin que quelqu'un puisse cocher des éléments séparés, je veux créer une fonction de sauvegarde et garder certains. En ce qui concerne une fonction de sauvegarde, je veux garder les chèques sauvegardés, y at-il des appels aux widgets pour sauver leurs états? Je sais que c'est beaucoup, mais merci pour l'aide.wxPython questions de mise en forme

EDIT (oublié le code)

import wx 
import urllib2 
from BeautifulSoup import BeautifulSoup 
from BeautifulSoup import Tag 
import re 
from pyparsing import makeHTMLTags, originalTextFor, SkipTo, Combine 
import wx 
import wx.html 
global P 

siteDict = {0:'http://www.reddit.com', 1:'http://www.boston.com', 2:'http://www.stumbleupon.com', 3:'news.google.com'} 

class citPanel(wx.Panel): 
    def __init__(self, parent, id): 
     wx.Panel.__init__(self, parent, id) 
     allSites = ['Reddit', 'Boston.com', 'StumbleUpon', 'Google News'] 
     wx.StaticText(self, -1, "Choose the Sites you would like Charlie to Visit:", (45, 15))  
     self.sitList = wx.CheckListBox(self, 20, (60, 50), wx.DefaultSize, allSites) 

class nextButton(wx.Button): 
    def __init__(self, parent, id, label, pos): 
     wx.Button.__init__(self, parent, id, label, pos) 

class checkList(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(400, 300)) 
     self.panel = citPanel(self, -1) 
     nextButton(self.panel, 30, 'Ok', (275, 50)) 
     self.Bind(wx.EVT_BUTTON, self.Clicked)  
     self.Centre() 
     self.Show(True) 

    def Clicked(self, event): 
     checkedItems = [i for i in range(self.panel.sitList.GetCount()) if self.panel.sitList.IsChecked(i)] 
     print checkedItems 
     r = [siteDict[k] for k in checkedItems] 
     print r 
     for each in r: 
      pre = '<HTML><head><title>Page title</title></head>' 
      post = '</HTML>' 
      site = urllib2.urlopen(each) 
      html=site.read() 
      soup = BeautifulSoup(html) 
      tags = soup.findAll('a') 

      soup1 = BeautifulSoup(''.join(str(t) for t in tags)) 

      for link in soup1.findAll('a'): 
       br= Tag(soup, 'p') 
       index= link.parent.contents.index(link) 
       link.parent.insert(index+1, br) 

      P = soup1.prettify() 
      print P 

     #for link2 in soup1.findAll('a'): 
      #p1= Tag(soup, ' 

      frm = MyHtmlFrame(None, "Charlie", P) 
      frm.Show() 




class MyHtmlFrame(wx.Frame): 
    def __init__(self, parent, title, page): 
     wx.Frame.__init__(self, parent, -1, title) 
     html = wx.html.HtmlWindow(self) 
     if "gtk2" in wx.PlatformInfo: 
      html.SetStandardFonts() 

     html.SetPage(page) 


     #app = wx.PySimpleApp() 

     #app.MainLoop() 


    #event.Skip() 




    #self.Destroy() 



app = wx.App() 



checkList(None, -1, 'Charlie') 
app.MainLoop() 

Répondre

0

Vous pouvez créer un seul panneau de réponse ou un cadre (en commençant par un cadre distinct, comme vous faites maintenant - MyHtmlFrame est très bien). Ne créez pas un nouveau panneau ou cadre pour chaque résultat.

Créez un `wx.ComboBox (self, -1, choices = ['google', 'so']) quelque part, et liez self.Bind (wx.EVT_COMBOBOX, myHtmlFrame.setFrame).

Vous devez maintenant écrire MyHtmlFrame.setFrame (self, event); utiliser choice = event.GetSelection(), puis self.html.SetPage(self.results_dict[choice])

Oh, et joindre un dictionnaire (results_dict) sur MyHtmlFrame, cartographie le choix ("google") au résultat racleuse.

À moins que vous ne souhaitiez que la zone de liste déroulante soit séparée, vous devrez apprendre à utiliser wx.Sizers.

class MyHtmlFrame(wx.Frame): 
    def __init__(self, parent, title, page, results_dict): 
     wx.Frame.__init__(self, parent, -1, title) 
     self.html = wx.html.HtmlWindow(self) 
     if "gtk2" in wx.PlatformInfo: 
      self.html.SetStandardFonts() 
     self.results_dict=results_dict #here 

     self.html.SetPage('') 

    def setFrame(self,event): 
     self.html.SetPage(self.results_dict[choice]) 
+0

Je suis vraiment désolé c'est si longtemps après que vous avez répondu, mais, j'ai eu beaucoup à la fin du mois. Je jouais avec ça, et j'avais quelques questions. Le dict, dites-vous de prendre chaque lien qu'il renvoie, et le mettre dans un dictionnaire avec la clé étant le site d'où il vient? Est-ce la seule façon de les faire apparaître dans la même fenêtre? En outre, je souhaitais que le cadre html fasse partie du même cadre que la case à cocher, donc serait-il initialisé vide, et peuplé après? – Kevin

+0

Je dis que vous n'avez pas besoin d'un nouveau cadre pour chaque résultat. Vous pouvez simplement définir le contenu d'une image en fonction de la page que vous souhaitez afficher. Bien sûr, vous pouvez utiliser wx.Notebook (ou choicebook, ou listbook ou wxTreebook) pour choisir entre plusieurs panneaux dans les onglets de Firefox. Aussi, regardez wx sizers pour mettre plusieurs widgets dans le même cadre. Mais obtenez une chose (soit la mise en page ou les onglets) qui fonctionne avant d'essayer l'autre. – wisty