Найти - Пользователи
Полная версия: Можно ли поместить в форму xls-лист?
Начало » Python для экспертов » Можно ли поместить в форму xls-лист?
1
proDiva

class MyFrameHtml(wx.Frame):
#создание формы
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title,
size=(450, 500))
_icon = wxEmptyIcon()
_icon.CopyFromBitmap(wxBitmap(“c:/cb/cfg/cb2.png”, wxBITMAP_TYPE_ANY))
self.SetIcon(_icon)
wind = wxSplitterWindow(self, -1)
pan1 = wxPanel(wind, -1)
pan2 = wxPanel(wind, -1)
wind.SetMinSize((450,500))
pan1.SetMinSize((450,425))
pan2.SetMinSize((450,30))
Font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)
wind.SplitHorizontally(pan1, pan2)
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)

self.html = html.HtmlWindow(pan1, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
self.html.SetMinSize((450,425))

self.printer = html.HtmlEasyPrinting()
self.current = “c:/myhtml.htm”

self.btn1 = wx.Button(pan2, -1, “Печать”)
self.btn1.SetFont(Font)
self.btn2 = wx.Button(pan2, -1, “Закрыть”)
self.btn2.SetFont(Font)

EVT_BUTTON(self, self.btn1.GetId(), self.on_print)
EVT_BUTTON(self, self.btn2.GetId(), self.on_close)

pan1.SetSizer(sizer_1)
pan2.SetSizer(sizer_2)

sizer_1.Add(self.html, 0, wx.EXPAND)
sizer_2.Add(self.btn1, -1, wx.EXPAND)
sizer_2.Add(self.btn2, -1, wx.EXPAND)

def on_print(self, evt):
self.printer.GetPrintData().SetPaperId(wx.PAPER_LETTER)
self.printer.PrintFile(self.html.GetOpenedPage())
evt.Skip()

def on_close(self, evt):
self.Destroy()
evt.Skip()


Таким образом я помещаю html-страницу в форму и могу вывести ее на печать из своей программы. Но не все можно реализовать посредством html, иногда приходится формировать xls-таблицу. Недостаток работы с pyExcelerator в том, что на печать придется выводить, предварительно найдя на диске сформированный xls-файл и открыв его. Нельзя ли каким-нибудь образом открыть содержимое xls-файла внутри формы, как это сделано для html-файла?
balu
Не понял вопроса. В чем проблема найти файл и открыть его? А конкретно по твоему вопросу используй ActiveX, если работаешь под оффтопиком. Но я не знаю дружит ли wx… c ActiveX. Хотя я бы этим не баловался.
proDiva
balu
А конкретно по твоему вопросу используй ActiveX, если работаешь под оффтопиком. Но я не знаю дружит ли wx… c ActiveX. Хотя я бы этим не баловался.
Что значит “под оффтопиком”? Я проверила, есть либы wx для открытия pdf, html, flash-файлов. и есть просто ActiveXWindow, т.е. возможно использовать файлы других приложений, только как это сделать? может кому-то встречались примеры?
Андрей Светлов
proDiva
Что значит “под оффтопиком”? Я проверила, есть либы wx для открытия pdf, html, flash-файлов. и есть просто ActiveXWindow, т.е. возможно использовать файлы других приложений, только как это сделать? может кому-то встречались примеры?
Вот пример из закромов родины

“”“
<html><body>
This demo shows how to embed an ActiveX control in a wxPython application, (Win32 only.)
<p>
The MakeActiveXClass function dynamically builds a new Class on the fly, that has the
same signature and semantics as wxWindow. This means that when you call the function
you get back a new class that you can use just like wxWindow, (set the size and position,
use in a sizer, etc.) except its contents will be the COM control.
</body></html>
”“”

import wx

from wx.lib.activexwrapper import MakeActiveXClass
import win32com.client.gencache

excelModule = win32com.client.gencache.EnsureModule(“{00020813-0000-0000-C000-000000000046}”, 0, 1, 2)


#———————————————————————-

class TestPanel(wx.Panel):
def __init__(self, parent, log):
wx.Panel.__init__(self, parent, -1)
self.log = log

sizer = wx.BoxSizer(wx.VERTICAL)
btnSizer = wx.BoxSizer(wx.HORIZONTAL)

# this function creates a new class that can be used as a
# wxWindow, but contains the given ActiveX control.
ActiveXWrapper = MakeActiveXClass(excelModule.Application)

# create an instance of the new class
self.excel = ActiveXWrapper( self, -1, style=wx.SUNKEN_BORDER)

sizer.Add(self.excel, 1, wx.EXPAND)

btnSizer.Add(50, -1, 2, wx.EXPAND)
sizer.Add(btnSizer, 0, wx.EXPAND)

self.SetSizer(sizer)
self.SetAutoLayout(true)


#———————————————————————-

def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win


#———————————————————————-


if __name__ == ‘__main__’:
import sys
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, “ActiveX test – Excel”, size=(640, 480),
style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)
self.tp = TestPanel(self, sys.stdout)

def OnCloseWindow(self, event):
self.tp.excel.Cleanup()
self.Destroy()


app = wx.PySimpleApp()
frame = TestFrame()
frame.Show(True)
app.MainLoop()

balu
proDiva
Что значит “под оффтопиком”?
Так юниксоиды называют Виндовс. Забылся.
proDiva
balu
Спасибо за разъяснение, теперь буду знать))

Андрей Светлов
Вышла ошибка:
“Traceback (most recent call last):
File ”C:\Python24\proba.py“, line 63, in -toplevel-
frame = TestFrame()
File ”C:\Python24\proba.py“, line 55, in __init__
self.tp = TestPanel(self, sys.stdout)
File ”C:\Python24\proba.py“, line 25, in __init__
ActiveXWrapper = MakeActiveXClass(excelModule.Application)
AttributeError: ‘NoneType’ object has no attribute ‘Application’”

Я проверила, в реестре в CLSID такой код есть, но почему-то он его не видит.
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