wxPython格式化问题

时间:2010-05-25 16:35:41

标签: python wxpython

我有一个应用程序,我正在努力了解有关wxPython的更多信息(我主要是一名脚本编写者)。我现在忘记了,我正在打开它。它是一个屏幕抓取器,我让它几乎按照我想要的方式工作,构建一个正则表达式解析器来去掉我不需要的每个scrape中的链接。我的问题是这个。在当前状态下,如果我检查多个站点,它会熄灭并在单独的窗口中返回它,for:Clicked函数中的每个部分。我想把它们放在一个框架中,完全放在窗口中。我还想知道我是否可以将他们读入的列表并将其发送到清单,因此有人可以检查单独的项目,我想建立一个保存功能并保留某些功能。关于保存功能,我想保留已保存的检查,是否有调用小部件来保存其状态?我知道这很多,但感谢你的帮助。

编辑(忘记密码)

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

1 个答案:

答案 0 :(得分:0)

你可以创建一个单独的答案面板或框架(从一个单独的框架开始,就像你现在正在做的那样 - MyHtmlFrame很好)。不要为每个结果创建新的面板或框架。

在某处创建一个`wx.ComboBox(self,-1,choices = ['google','so']),绑定self.Bind(wx.EVT_COMBOBOX,myHtmlFrame.setFrame)。

现在你需要编写MyHtmlFrame.setFrame(self,event);使用choice = event.GetSelection(),然后self.html.SetPage(self.results_dict[choice])

哦,并在MyHtmlFrame上附加字典(results_dict),将选项("google")映射到刮刀结果。

除非你想在单独的框架中使用组合框,否则你将不得不学习如何使用wx.Sizer。

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