Открытие нескольких окон из списка в WxPython - PullRequest
0 голосов
/ 13 января 2010

У меня есть небольшая программа, которая идет к новостному агрегатору, получает hrefs и возвращается в окне. Я хочу, чтобы было открыто несколько окон, если выбрано несколько сайтов, прямо сейчас, он будет идти только к первому в списке и завершится идеально. Я предполагаю, что неправильно передаю содержимое списка следующему шагу в моей программе.

import wx
import urllib2
from BeautifulSoup import BeautifulSoup
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.digg.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', 'Digg', '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))
            print soup1.prettify()

            aTag,aEnd = makeHTMLTags("A")

            aTag = originalTextFor(aTag)
            aEnd = originalTextFor(aEnd)

            aLink = aTag + SkipTo(aEnd) + aEnd
            aLink.setParseAction(lambda tokens : ''.join(tokens))

            links = aLink.searchString(html)

            out = []
            out.append(pre)
            out.extend(['  '+lnk[0] for lnk in links])
            out.append(post)

            P= '\n'.join(out)
            print type(P)

            print P




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

                    html.SetPage(P)


            app = wx.PySimpleApp()
            frm = MyHtmlFrame(None, "Charlie")
            frm.Show()
            app.MainLoop()


    #event.Skip()




    #self.Destroy()



app = wx.App()



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

У меня есть некоторые операторы печати для отладки. Итак, любая помощь, высоко ценится. Кроме того, если бы все они оказались в одном и том же окне, это тоже было бы хорошо. Просто пытаюсь пройти мимо единственного, делающего первый

Ответы [ 2 ]

1 голос
/ 14 января 2010

EEEK! Вы определяете свой класс MyHTMLFrame -inside- функцию обработчика событий (не очень хорошая идея).

Я не могу запустить скрипт, так как у меня нет модуля PyParsing (всегда делайте сэмплы, которые имеют как можно меньше зависимостей ...)

Поэтому я не уверен, работает ли этот код, но он должен дать вам общее представление. Вот модифицированный код, я только немного изменился после функции clicked ()

    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))
            print soup1.prettify()

            aTag,aEnd = makeHTMLTags("A")

            aTag = originalTextFor(aTag)
            aEnd = originalTextFor(aEnd)

            aLink = aTag + SkipTo(aEnd) + aEnd
            aLink.setParseAction(lambda tokens : ''.join(tokens))

            links = aLink.searchString(html)

            out = []
            out.append(pre)
            out.extend(['  '+lnk[0] for lnk in links])
            out.append(post)

            P= '\n'.join(out)
            print type(P)

            print P

            # create the html frame, pass it in your string
            frm = MyHtmlFrame(None, "Charlie", P)
            frm.Show()



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

    html.SetPage(page)



app = wx.App()

checkList(None, -1, 'Charlie') 
checkList.Show()   # show first frame, which opens other windows
app.MainLoop()

тьфу, я ненавижу отступ в 4 пробела для запуска кода в StackOverflow. Надеюсь, что это работает для вас!

0 голосов
/ 14 января 2010

Я не знаком с WxPython, но, похоже, у вас работает два MainLoop.
Я получил вашу программу, чтобы открыть два окна, когда я закомментировал две строки, как показано ниже:

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

                html.SetPage(P)


        #app = wx.PySimpleApp()
        frm = MyHtmlFrame(None, "Charlie")
        frm.Show()
        #app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...