2010-05-25 2 views
0

У меня есть приложение, над которым я работал, чтобы узнать больше о wxPython (я был главным образом скриптером). Я забыл об этом, теперь я открываю его. Это скребок экрана, и я работаю почти так, как хочу, собираюсь создать парсер регулярных выражений, чтобы вырезать ссылки в каждой царапине, которая мне не нужна. У меня есть вопросы. В этом текущем состоянии, если я проверяю несколько сайтов, он выходит и сбрасывается и возвращает его в отдельных окнах, для каждого раздела в функции Clicked. Я хочу положить их в рамку, в окно, в целом. Я также хочу знать, могу ли я взять список, который они считывают, и отправить его в контрольный список, чтобы кто-то мог проверять отдельные элементы, я хочу создать функцию сохранения и сохранить определенные. Что касается функции сохранения, я хочу сохранить сохраненные проверки, есть ли призывы к виджетам, чтобы сохранить их состояния? Я знаю, что это много, но спасибо за помощь.Вопросы по форматированию wxPython

EDIT (забыл код)

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() 

ответ

0

Вы можете создать единую панель ответа или кадр (начните с отдельным кадром, как вы делаете сейчас - MyHtmlFrame штрафа). Не создавайте новую панель или фрейм для каждого результата.

Создайте `wx.ComboBox (self, -1, choice = ['google', 'so']) где-нибудь и привяжите self.Bind (wx.EVT_COMBOBOX, myHtmlFrame.setFrame).

Теперь вам нужно написать MyHtmlFrame.setFrame (self, event); использовать choice = event.GetSelection(), затем self.html.SetPage(self.results_dict[choice])

О, и прикрепить словарь (results_dict) на MyHtmlFrame, отображающая выбор ("google") в результате скребка.

Если вы не хотите использовать комбинированную коробку в отдельной рамке, вам нужно научиться использовать 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

Мне очень жаль, что так долго после того, как вы ответили, но у меня было много в конце месяца. Я играл с этим, и у меня было несколько вопросов. Дик, вы говорите, что берете каждую ссылку, которую он возвращает, и помещаете ее в словарь с ключом, являющимся сайтом, из которого он пришел? Это единственный способ заставить их показать в одном окне? Кроме того, я был заинтересован в том, чтобы html-фрейм был частью того же фрейма, что и флажок, так что он будет инициализирован пустым и заселен после? – Kevin

+0

Я говорю, что для каждого результата вам не нужен новый фрейм. Вы можете просто установить содержимое одного кадра в зависимости от того, какую страницу вы хотите просмотреть. Конечно, вы можете использовать wx.Notebook (или книгу выбора, или listbook или wxTreebook), чтобы выбрать между вкладками вкладки ala Firefox. Кроме того, посмотрите на wx sizers для размещения нескольких виджетов в одном фрейме. Но заработайте одно (либо макет, либо вкладки), прежде чем попробовать другой. – wisty

Смежные вопросы