Форум сайта python.su
Скорей бы доделали, а то wxHtmlWindow уж больно убог.
Офлайн
Ну так что нашли решение как отобразить CSS и JavaScript????
Офлайн
Да как сказать. Нашел некоторые компоненты, но у каждого из них свои косяки. Тут уже писали про wxWebKit, но если потом делать exe-шник с помощью py2exe или ему подобным, то придется включать dll-ку на 50 МБ + не нашел нормальной документации, хотя не сильно и искал.
Есть оболочка над Мозиллой - http://www.kirix.com/labs/wxwebconnect.html Но готовой сборки для wxPython не нашел.
В общем, идеального рендера не нашел.
Офлайн
Jenyayясно… ты случайно не можешь мне помочь вот в этом - как отобразить Html страницы в нужном порядке?
Да как сказать. Нашел некоторые компоненты, но у каждого из них свои косяки. Тут уже писали про wxWebKit, но если потом делать exe-шник с помощью py2exe или ему подобным, то придется включать dll-ку на 50 МБ + не нашел нормальной документации, хотя не сильно и искал.
Есть оболочка над Мозиллой - http://www.kirix.com/labs/wxwebconnect.html Но готовой сборки для wxPython не нашел.
В общем, идеального рендера не нашел.
#!/usr/bin/python
# -*- coding: utf-8 -*-
from wxPython.wx import *
from wxPython.html import *
import os,sys
class exHtmlWindow(wxHtmlWindow):
def __init__(self, parent, id, frame):
wxHtmlWindow.__init__(self,parent,id)
# получение адреса кликнутой ссылки
def OnLinkClicked(self, link):
print "url = ",link.GetHref()
link=link.GetHref()
self.LoadPage(link)
# класс панели (контейнер для всех виджетов)
class exHtmlPanel(wxPanel):
def __init__(self, parent, id, frame):
wxPanel.__init__(self, parent, -1)
self.frame = frame
self.cwd = os.path.split(sys.argv[0])[0]
if not self.cwd:
self.cwd = os.getcwd
self.box = wxBoxSizer(wxVERTICAL)
# блок с кнопками
subbox = wxBoxSizer(wxHORIZONTAL)
btn = wxButton(self, 1202, u"Загрузка файла")
EVT_BUTTON(self, 1202, self.OnLoadFile)
subbox.Add(btn, 1, wxGROW | wxALL, 2)
btn = wxButton(self, 1203, u"Переход на страницу")
EVT_BUTTON(self, 1203, self.OnLoadPage)
subbox.Add(btn, 1, wxGROW | wxALL, 2)
btn = wxButton(self, 1204, u"<-- Назад")
EVT_BUTTON(self, 1204, self.OnBack)
subbox.Add(btn, 1, wxGROW | wxALL, 2)
btn = wxButton(self, 1205, u"Вперед -->")
EVT_BUTTON(self, 1205, self.OnForward)
subbox.Add(btn, 1, wxGROW | wxALL, 2)
self.box.Add(subbox, 0, wxGROW)
self.SetSizer(self.box)
self.SetAutoLayout(true)
# ОКНА
subbox = wxBoxSizer(wxHORIZONTAL)
html = exHtmlWindow(self, -1, self.frame)
html.LoadPage("offers.html") # загрузка нужной страницы
subbox.Add(html, 2, wxGROW | wxALL, 2)
html2 = exHtmlWindow(self, -1, self.frame)
subbox.Add(html2, 2.2, wxGROW | wxALL, 2)
html3 = exHtmlWindow(self, -1, self.frame)
subbox.Add(html3, 3, wxGROW | wxALL, 2)
self.box.Add(subbox, 1, wxGROW)
def OnLoadPage(self, event):
dlg = wxTextEntryDialog(self, u'Введите адрес страницы:', 'Переход')
if dlg.ShowModal() == wxID_OK:
self.destination = dlg.GetValue()
dlg.Destroy()
self.html.LoadPage(self.destination)
def OnLoadFile(self, event):
dlg = wxFileDialog(self, wildcard = '*.htm*', style=wxOPEN)
if dlg.ShowModal():
path = dlg.GetPath()
self.html1.LoadPage(path)
dlg.Destroy()
def OnBack(self, event):
if not self.html.HistoryBack():
wxMessageBox(u"Больше нет посещенных страниц!")
def OnForward(self, event):
if not self.html.HistoryForward():
wxMessageBox(u"Больше нет посещенных страниц!")
# Подарим нашему окну собственную иконку self.SetIcon(wx.IconFromBitmap(icon))
icon = wx.Bitmap('logo2.png')
self.SetIcon(wx.IconFromBitmap(icon))
# класс главного окна:
class exFrame(wxFrame):
def __init__(self, parent, ID, title):
wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(600,750))
panel = exHtmlPanel (self, -1, self) # создание панели
# создание статусной строки
self.CreateStatusBar()
# статус по умолчанию
self.SetStatusText(u"Статус по умолчанию")
mnu_file = wxMenu() # создание колонки меню
mnu_file.Append(101, u"Выход", u"Нажмите чтобы выйти из браузера") # добавление пункта меню ВЫХОД с подсказкой
mnu_file.AppendSeparator() # добавление разделителя в меню
mnu_file.Append(102, u'О программе', u'Нажмите чтобы посмотреть сведения программы ') # добавление пункта меню О программе
menuBar = wxMenuBar() # создание строки меню
menuBar.Append(mnu_file, u"Файл") # добавление созданной колонки меню в строку меню
self.SetMenuBar(menuBar) # установка созданной строки меню
EVT_MENU(self, 101, self.Exit) # привязка кнопки меню к событию - выход
EVT_MENU(self, 102, self.OnAbout) # привязка кнопки меню к событию - о программе
def Exit(self, event):
self.Close(true)
def OnAbout(self, event):
# вывод всплывающего модального окна сообщения:
wx.MessageBox(u'Пробная версия!!! ', u'О программе', wx.OK | wx.ICON_INFORMATION, self)
# класс приложения. Каждая программа должна иметь один такой объект
class exApp(wxApp):
def OnInit(self): # Метод OnInit() - вызывается при запуске приложения
# для отображения изображений
wxInitAllImageHandlers()
# создание главного окна:
frame = exFrame(NULL, -1, u"Мой браузер")
# отображение главного окна:
frame.Show(true)
# определение главного окна приложения:
self.SetTopWindow(frame)
return true
app = exApp(0)
app.MainLoop() # Запускаем бесконечный цикл, который будет обрабатывать все сообщения в нашей программе.
Офлайн
А проблема в том, чтобы разместить контролы на окне или обработать нажатие ссылок? Для второго смотри событие wx.html.EVT_HTML_LINK_CLICKED.
Если проблема с размещением контролов, то вот набросал окно с помощью wxGlade:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Mon May 24 21:03:34 2010
import wx
import wx.html
# begin wxGlade: extracode
# end wxGlade
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.htmlwindow_1 = wx.html.HtmlWindow(self, -1)
self.htmlwindow_2 = wx.html.HtmlWindow(self, -1)
self.htmlwindow_3 = wx.html.HtmlWindow(self, -1)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame_1")
self.htmlwindow_1.SetMinSize((100, 300))
self.htmlwindow_2.SetMinSize((100, 300))
self.htmlwindow_3.SetMinSize((100, 300))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
grid_sizer_1 = wx.FlexGridSizer(1, 3, 0, 0)
grid_sizer_1.Add(self.htmlwindow_1, 1, wx.ALL|wx.EXPAND, 2)
grid_sizer_1.Add(self.htmlwindow_2, 1, wx.ALL|wx.EXPAND, 2)
grid_sizer_1.Add(self.htmlwindow_3, 1, wx.ALL|wx.EXPAND, 2)
self.SetSizer(grid_sizer_1)
grid_sizer_1.Fit(self)
grid_sizer_1.AddGrowableRow(0)
grid_sizer_1.AddGrowableCol(0)
grid_sizer_1.AddGrowableCol(1)
grid_sizer_1.AddGrowableCol(2)
self.Layout()
# end wxGlade
# end of class MyFrame
class MyApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
self.SetTopWindow(frame_1)
frame_1.Show()
return 1
# end of class MyApp
if __name__ == "__main__":
app = MyApp(0)
app.MainLoop()
Офлайн
Да, кстати,
from wxPython.wx import *
from wxPython.html import *
это устаревшая запись, ей лучше не пользоваться, У меня твой код даже отказался запускаться.
Офлайн
Дружище, за код спасибо, но я в нем буду долго разбираться… ты мне скажи вот мои 3 html окна: html, html2, html3
# ОКНА
subbox = wxBoxSizer(wxHORIZONTAL)
html = exHtmlWindow(self, -1, self.frame)
html.LoadPage(“offers.html”) # загрузка нужной страницы
subbox.Add(html, 2, wxGROW | wxALL, 2)
html2 = exHtmlWindow(self, -1, self.frame)
subbox.Add(html2, 2.2, wxGROW | wxALL, 2)
html3 = exHtmlWindow(self, -1, self.frame)
subbox.Add(html3, 3, wxGROW | wxALL, 2)
self.box.Add(subbox, 1, wxGROW)
в первое окно изначально загружается страничка offers.html
как мне сделать так, чтобы когда я кликну по ссылки в первом окне, то эта ссылка откроется в окне html2, а когда я кликну по ссылке в окне html2, то откроется страничка в окне html3????????
Офлайн
Полностью код писать лень. Просто подпишись на событие wx.html.EVT_HTML_LINK_CLICKED. Тогда с помощью вот такого кода можно будет узнать ссылку, по которой кликнули.
def onLinkClicked (self, event):
"""
Клик по ссылке
"""
info = event.GetLinkInfo()
href = info.GetHref()
Офлайн
JenyayАга, это у меня есть… и оно находится в классе wxHtmlWindow… а сами html окна находятся в классе wxPanel… так как мне из wxPanel вызвать функцию onLinkClicked, находящуюся в wxHtmlWindow при нажатии на ссылку???
Полностью код писать лень. Просто подпишись на событие wx.html.EVT_HTML_LINK_CLICKED. Тогда с помощью вот такого кода можно будет узнать ссылку, по которой кликнули.onLinkClicked - это обработчик того самого события.def onLinkClicked (self, event):
"""
Клик по ссылке
"""
info = event.GetLinkInfo()
href = info.GetHref()
Офлайн
С GUI на десктопе не работал, но возник вопрос -
нелзя запустить нормальный браузер и “нашлепать” его сверху габаритного окна в GUI?
или, если к ресайзу окна браузера не подобраться, то пусть браузер запускает JS скрипт, который сделает попап окно, в которое загрузится целевая страница? JS-код для попапа генерить питоном под текщие габариты и координаты.
Минус - при перетаскивании и ресайзе главного окна (GUI) вся апликация нарушится.
Плюс - полноценный браузер!
Как такой вариант?
Офлайн