Найти - Пользователи
Полная версия: Просмоторщик HTML
Начало » GUI » Просмоторщик HTML
1 2
Jenyay
Скорей бы доделали, а то wxHtmlWindow уж больно убог.
Sanya328
Ну так что нашли решение как отобразить CSS и JavaScript????
Jenyay
Да как сказать. Нашел некоторые компоненты, но у каждого из них свои косяки. Тут уже писали про wxWebKit, но если потом делать exe-шник с помощью py2exe или ему подобным, то придется включать dll-ку на 50 МБ + не нашел нормальной документации, хотя не сильно и искал.

Есть оболочка над Мозиллой - http://www.kirix.com/labs/wxwebconnect.html Но готовой сборки для wxPython не нашел.

В общем, идеального рендера не нашел.
Sanya328
Jenyay
Да как сказать. Нашел некоторые компоненты, но у каждого из них свои косяки. Тут уже писали про wxWebKit, но если потом делать exe-шник с помощью py2exe или ему подобным, то придется включать dll-ку на 50 МБ + не нашел нормальной документации, хотя не сильно и искал.

Есть оболочка над Мозиллой - http://www.kirix.com/labs/wxwebconnect.html Но готовой сборки для wxPython не нашел.

В общем, идеального рендера не нашел.
ясно… ты случайно не можешь мне помочь вот в этом - как отобразить Html страницы в нужном порядке?

Программный код программы, суть которого состоит в следующем: главное окно программы поделено на 3 колонки, каждая из которых по сути является окном браузера. Мне нужно сделать так, чтобы когда я из первой колонки нажму на ссылку, откроется это ссылка во второй колонке, а когда я нажму на ссылку во второй колонке - то откроется в 3-й колонке… Для чего это нужно!!!! Суть - это прога для отображения прайс листов магазинов… в первой колонке у меня названия магазина, кликнули по названию –> отобразились категории товаров во второй колонке, которые данный магазин реализует, далее кликнули по категории –> отобразился весь товар этой категории в третьей колонке… Вопрос КАК сделать отображение HTML страниц по такой иерархии?
#!/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() # Запускаем бесконечный цикл, который будет обрабатывать все сообщения в нашей программе.
Jenyay
А проблема в том, чтобы разместить контролы на окне или обработать нажатие ссылок? Для второго смотри событие 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()
Jenyay
Да, кстати,

from wxPython.wx import *
from wxPython.html import *

это устаревшая запись, ей лучше не пользоваться, У меня твой код даже отказался запускаться.
Sanya328
Дружище, за код спасибо, но я в нем буду долго разбираться… ты мне скажи вот мои 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????????
Jenyay
Полностью код писать лень. Просто подпишись на событие wx.html.EVT_HTML_LINK_CLICKED. Тогда с помощью вот такого кода можно будет узнать ссылку, по которой кликнули.

def onLinkClicked (self, event):
"""
Клик по ссылке
"""
info = event.GetLinkInfo()
href = info.GetHref()
onLinkClicked - это обработчик того самого события.
Sanya328
Jenyay
Полностью код писать лень. Просто подпишись на событие wx.html.EVT_HTML_LINK_CLICKED. Тогда с помощью вот такого кода можно будет узнать ссылку, по которой кликнули.

def onLinkClicked (self, event):
"""
Клик по ссылке
"""
info = event.GetLinkInfo()
href = info.GetHref()
onLinkClicked - это обработчик того самого события.
Ага, это у меня есть… и оно находится в классе wxHtmlWindow… а сами html окна находятся в классе wxPanel… так как мне из wxPanel вызвать функцию onLinkClicked, находящуюся в wxHtmlWindow при нажатии на ссылку???
pioner
С GUI на десктопе не работал, но возник вопрос -
нелзя запустить нормальный браузер и “нашлепать” его сверху габаритного окна в GUI?
или, если к ресайзу окна браузера не подобраться, то пусть браузер запускает JS скрипт, который сделает попап окно, в которое загрузится целевая страница? JS-код для попапа генерить питоном под текщие габариты и координаты.
Минус - при перетаскивании и ресайзе главного окна (GUI) вся апликация нарушится.
Плюс - полноценный браузер!

Как такой вариант?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB