Pyside:使用 cython 编译应用程序时,addToJavaScriptWindowObject 无法正常工作

2024-03-09

我构建了一个运行几千行代码的应用程序。

我试图通过将 python 代码编译为 c 代码,然后编译为目标文件来隐藏代码。

该应用程序在 pyside 中运行良好。我转换了这个 python 文件。py to a .c文件并将 c 编译为目标文件.o。该文件的名称是test2.py以及我将其转换为.o file:

 cython --embed -o test2.c test2.py

从上面我现在将 test2.c 编译为 test2.o 如下

gcc -I /usr/include/python2.7 -o test2.o -fPIC test2.c -lpython2.7 -lpthread -lm -lutil -ldl

我的问题是 webkit 框架中设计的最小化和关闭按钮在编译后不起作用(但是从 python 文件执行时效果很好)并且其他 addtoJavascripWindowObjects 不起作用

我使用 Pyside 开发了一个简单的框架窗口模型,里面什么都没有

test2.py文件代码如下: 我的代码如下

from __future__ import print_function
import sys
import json
import threading
from time import sleep
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import QWebView, QWebSettings
from PySide.QtNetwork import QNetworkRequest

title_bar_str="""<!doctype html>
<html>
<body>

<section id="exit_panel">
    <div id="window_title_meta_container">
        <img id="window_title_icon" draggable="false">
        <div id="window_title"></div>
    </div>
    <div id="min_close_container">
    <div id="min_ap" class="win_signals">_</div>
    <div id="close_ap" class="win_signals">x</div>
    </div>
</section>
<style>
img#window_title_icon{
    display: none;
    width:25px;
    height:25px;
    vertical-align:top;
    border:none;
}
#window_title_meta_container{
    float:left;
    color:grey !important;
}
#window_title_meta_container,#window_title_icon,#window_title{
    display:inline-block;
}
#title_bar{
    color:black;
    background: -webkit-linear-gradient(blue,grey);
    font-size:15px;
}
.btns{
    position:relative;
    display:inline-block;
    padding:5px;
    border:solid red 1px;
    background:red;
    left:85%
}
body{
    border:solid black 1px;
    height:100%;
    margin:auto;
    background:red;
    -webkit-user-select:none;
    -moz-user-select:none;

}
body:hover{
    cursor:pointer;
}
html,body{
    overflow:hidden
}
.win_signals{
    display:inline-block;
    padding:5px;

}
#close_ap,#min_ap{
color: white;
background: rgb(18, 110, 201) none repeat scroll 0% 0%;
border-radius: 10px;            
}
#close_ap:hover,#min_ap:hover{
    cursor:pointer;
    background:green;
}
#min_close_container{
position: relative;;
display: inline-block;
}

#exit_panel{
    text-align: right;
    background: -webkit-linear-gradient(#104477, #000) repeat scroll 0% 0% transparent;
    color: white;
}
</style>
<script>
window.onload=function(){
    document.getElementById('close_ap').onclick=function(){
        console.log(trigger_title_signals.close(''))
    }
    document.getElementById('min_ap').onclick=function(){
        console.log(trigger_title_signals.minimize(''))
    }    


}

</script>
</body>
</html>
</doctype>

"""
class Frame(QFrame,QObject):
    def __init__(self):
        super(Frame,self).__init__()
        self.gui_height=None
        self.title_bar_height=None
        self.html_title_bar_webview=web_view_with_move(self)
        self.html_title_bar_webview.init_signals()
        self.html_title_bar_webview.setContent(title_bar_str)
        self.html_title_bar_webview.page().mainFrame().setScrollBarPolicy(Qt.Vertical,Qt.ScrollBarAlwaysOff)
        self.html_title_bar_webview.page().mainFrame().setScrollBarPolicy(Qt.Horizontal,Qt.ScrollBarAlwaysOff)
        self.html_title_bar_webview.page().mainFrame().addToJavaScriptWindowObject("Frame",self)      
        self.title_bar_q_widget=title_bar_q()
        self.title_bar_q_widget.setMaximumHeight(35)
        self.title_bar_q_widget.setMinimumHeight(35)
        self.title_bar_q_widget.setContentsMargins(0,0,0,0)
        #self.title_bar_q_widget.layout.setSpacing(0)
        self.title_bar_q_widget_layout=QGridLayout()
        self.title_bar_q_widget_layout.setSpacing(0)
        self.title_bar_q_widget_layout.setContentsMargins(0,0,0,0)
        self.title_bar_q_widget_layout.setVerticalSpacing(0);
        self.title_bar_q_widget_layout.addWidget(self.html_title_bar_webview)
        self.title_bar_q_widget.setLayout(self.title_bar_q_widget_layout)
        #self.html_title_bar_webview.page().mainFrame().evaluateJavaScript("Frame.adjustTitleBarHeight(getComputedStyle(document.body,null).height)")  
        #######
        self.adstar_gui_webview=web_view()
        self.adstar_gui_webview.page().mainFrame().addToJavaScriptWindowObject("Frame",self)          
        self.adstar_gui_webview.show()

        self.adstar_gui_webview.page().mainFrame().setScrollBarPolicy(Qt.Vertical,Qt.ScrollBarAlwaysOff)
        self.adstar_gui_q_widget=QWidget()
        self.adstar_gui_q_widget.setContentsMargins(0,0,0,0)
        self.adstar_gui_q_widget_layout=QGridLayout()
        self.adstar_gui_q_widget_layout.setSpacing(0)
        self.adstar_gui_q_widget_layout.setVerticalSpacing(0)
        self.adstar_gui_q_widget_layout.setContentsMargins(0,0,0,0)
        self.adstar_gui_q_widget_layout.addWidget(self.adstar_gui_webview)
        self.adstar_gui_q_widget.setLayout(self.adstar_gui_q_widget_layout)

        ######
        #self.html_title_bar.show()
#        self.adstar_gui.show()
        self.layout=QGridLayout()
        self.layout.setContentsMargins(0,0,0,0)
        self.layout.setSpacing(0)
        self.layout.setVerticalSpacing(0)
        #self.layout.setHorizontalSpacing(0)        
        self.layout.addWidget(self.title_bar_q_widget)   
        self.layout.addWidget(self.adstar_gui_q_widget)
        self.setLayout(self.layout)
        self.setWindowFlags(Qt.FramelessWindowHint)
    @Slot(str)
    def python_evaluate_variable(self,var):
        global stop_session
        if var != "":
            exec(var)                    
    @Slot(str)
    def setWindowTitle(self,win_title_str):
        self.win_title_str=win_title_str
        self.html_title_bar_webview.page().mainFrame().evaluateJavaScript("document.getElementById('window_title').textContent='%s'" % (self.win_title_str,))

    def closeEvent(self,event):
        global main
        #super(Frame,self).closeEvent(event)
        try:
            if main==None:
                return
        except NameError:
            main=None
        if self==main:
            for child_win in all_windows:
                child_win.close()
                #del self
                QCoreApplication.processEvents()

class web_view_with_move(QWebView):
    def __init__(self,qframe):
        super(web_view_with_move,self).__init__()
        self.mouseup=None
        self.mousedown=None
        self.qframe=qframe
        self.settings().setAttribute(QWebSettings.WebAttribute.DeveloperExtrasEnabled, True)
    def mouseReleaseEvent(self,event):
        super(web_view_with_move,self).mouseReleaseEvent(event)        
        self.mouseup=True
        self.mousedown=False

    def mousePressEvent(self, event):
        super(web_view_with_move,self).mousePressEvent(event)        
        self.offset = event.pos()
        self.mouseup=False
        self.mousedown=True

    def init_signals(self):
        self.title_bar_signals=title_bar_signals(self.qframe)
        self.page().mainFrame().addToJavaScriptWindowObject("trigger_title_signals",self.title_bar_signals)



    def mouseMoveEvent(self, event):
        super(web_view_with_move,self).mouseMoveEvent(event)         
        if self.mousedown is True:
            x=event.globalX()
            y=event.globalY()
            x_w = self.offset.x()
            y_w = self.offset.y()
            self.qframe.move(x-x_w, y-y_w)


class title_bar_signals(QObject):
    def __init__(self,qframe):
        super(title_bar_signals,self).__init__()
        self.qframe=qframe
    @Slot(str)
    def close(self,tmp):
        self.qframe.close()
        #del self
        QCoreApplication.processEvents()
    @Slot(str)
    def minimize(self,tmp):
        self.qframe.showMinimized()
        #self.qframe.setWindowState(Qt.WindowMinimized)
        QCoreApplication.processEvents()

class title_bar_q(QWidget):
    def __init__(self):
        super(title_bar_q,self).__init__()


    def mouseReleaseEvent(self,event):
        super(title_bar_q,self).mouseReleaseEvent(event)
        self.mouseup=True
        self.mousedown=False



    def mousePressEvent(self, event):
        super(title_bar_q,self).mousePressEvent(event)        
        self.offset = event.pos()
        self.mouseup=False
        self.mousedown=True


    def mouseMoveEvent(self, event):
        super(title_bar_q,self).mouseMoveEvent(event)
        if self.mousedown is True:
            x=event.globalX()
            y=event.globalY()
            x_w = self.offset.x()
            y_w = self.offset.y()
            main.move(x-x_w, y-y_w)

class web_view(QWebView):
    def __init__(self):
        super(web_view,self).__init__()
        self.settings().setAttribute(QWebSettings.WebAttribute.DeveloperExtrasEnabled, True)

def main():
    try:
        Qapp=QApplication(sys.argv)
        ev_runner=QCoreApplication
        main=Frame()
        main.setAttribute(Qt.WA_DeleteOnClose)
        main.adstar_gui_q_widget.setMinimumWidth(850)
        main.adstar_gui_q_widget.setMaximumWidth(850)    
        main.setMinimumHeight(790)
        main.setMaximumHeight(790)
        main.setWindowTitle("Application")
        ev=QCoreApplication
        main.show()
        QCoreApplication.processEvents()
        Qapp.exec_()
    except KeyboardInterrupt:
        pass    
if __name__=="__main__":
    main()

注意:我是如何实现标题栏的

  • 我在名为的类中创建了一个 webview 框架Frame
  • self.html_title_bar_webview=web_view_with_move(self)
    
  • 我执行了一个 init_signal() 类,它添加了 javascript 窗口对象
  • self.html_title_bar_webview.init_signals()
    

    None

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    Pyside:使用 cython 编译应用程序时,addToJavaScriptWindowObject 无法正常工作 的相关文章

    • 如何从网站中抓取动态内容?

      所以我使用 scrapy 从亚马逊图书部分抓取数据 但不知何故我知道它有一些动态数据 我想知道如何从网站中提取动态数据 到目前为止我已经尝试过以下方法 import scrapy from items import AmazonsItem
    • keras 层教程和示例

      我正在尝试编码和学习不同的神经网络模型 我对输入维度有很多复杂性 我正在寻找一些教程 显示层的差异以及如何设置每个层的输入和输出 Keras 文档 https keras io layers core 向您展示所有input shape每层
    • 将嵌套循环计算转换为 Numpy 以加速

      我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
    • 按 A 列删除重复项,保留 B 列中具有最高值的行

      我有一个数据框 A 列中有重复值 我想删除重复项 保留 B 列中具有最高值的行 So this A B 1 10 1 20 2 30 2 40 3 10 应该变成这样 A B 1 20 2 40 3 10 我猜想可能有一种简单的方法可以做到
    • 将字段重新格式化为列,其他字段(与先前结构中成为列的字段配对)成为新列中的字段

      我的任务是清理慈善机构设计的移动应用程序中的数据 在一个部分中 用户问答应用程序使用会话由一行表示 该部分由重复的问题答案字段对组成 其中一个字段代表所提出的问题 然后它旁边的字段代表相应的答案 每个问题 字段和答案列对一起代表一个独特的问
    • Python gdal 未定义符号 GDALRasterBandGetVirtualMem

      我正在尝试使用Python GDAL 绑定 https pypi python org pypi GDAL 通过 pip 天真地安装绑定时 安装失败并显示错误 VSIFTruncateL 未在此范围内声明 https gis stackex
    • 使用DockerOperator时如何同时使用xcom_push=True和auto_remove=True?

      Problem 跑步时DockerOperator with xcom push True xcom all True and auto remove True 任务会引发错误 就好像容器在读取其内容之前被删除一样STDOUT Exampl
    • VS Code Pylint 在缺失的函数/类文档字符串上用蓝色下划线突出显示整个函数

      这种情况突然开始发生 当出现缺少函数文档字符串警告时 python pylint 会用蓝色波浪线突出显示整个函数 我怎样才能让它只突出显示函数定义或在定义行上制作一个小指示器 在开发时突出显示整个文件是非常烦人的 这是缺少类文档字符串的示例
    • 从内存中发送图像

      我正在尝试为 Discord 机器人实现一个系统 该系统可以动态修改图像并将其发送给机器人用户 为此 我决定使用 Pillow PIL 库 因为它对于我的目的来说似乎简单明了 这是我的工作代码的示例 它加载一个示例图像 作为测试修改 在其上
    • 导入 scipy.stats 时,出现“ImportError: DLL load failed: 找不到指定的过程”

      我无法导入 scipy stats 并收到以下错误 但不知何故 import scipy as sp 仍然可以正常工作 其他库如numpy pandas都可以毫无问题地导入 我尝试在 Anaconda 中重新安装 scipy 1 2 1 降
    • Emacs:在缓冲区求值期间将参数传递给下级 Python shell

      最近我开始使用 Emacs 作为 Python IDE 它不太直观 我现在遇到的问题是当使用 C c C c 评估缓冲区时如何将命令行参数传递给下级 python shell 感谢帮助 这似乎并不容易实现 管理的劣质流程python el模
    • 将 pandas 多索引数据帧转换为嵌套字典

      我有一个 pandas 多索引数据框 我试图将其输出为嵌套字典 create the dataset data clump thickness 0 0 274 0 0 1 19 0 1 0 67 0 1 1 12 0 2 0 83 0 2
    • 在Python中将用户昵称转换为正式名字

      我正在尝试根据 Python 中的用户名字和姓氏映射来自不同系统的用户 一个问题是 名字在很多情况下都是 昵称 例如 对于用户来说 他的名字在一个系统中是 Dave 而在另一个系统中是 David python 中有没有简单的方法可以将这些
    • Python 用静态图像将 mp3 转换为 mp4

      我有x文件包含一个列表mp3我想转换的文件mp3文件至mp4文件带有static png photo 似乎这里唯一的方法是使用ffmpeg但我不知道如何实现它 我编写了脚本来接受输入mp3文件夹和一个 png photo 然后它将创建新文件
    • 如何更改Python使用的SQLite版本?

      我在 Debian 9 12 上安装了 Python 3 8 和 SQLite 3 16 2 并且需要升级到较新版本的 SQLite 我已经下载并编译了 SQLite 网站上提供的合并 并将其放入 usr bin 所以当我这样做时 sqli
    • 将索引数组转换为 NumPy 中的 one-hot 编码数组

      给定一个一维索引数组 a array 1 0 3 我想将其一次性编码为二维数组 b array 0 1 0 0 1 0 0 0 0 0 0 1 创建归零数组b有足够的列 即a max 1 然后 对于每一行i 设置a i 第 列 至1 gt
    • 访问 Scrapy 内的 django 模型

      是否可以在 Scrapy 管道内访问我的 django 模型 以便我可以将抓取的数据直接保存到我的模型中 我见过this https scrapy readthedocs org en latest topics djangoitem ht
    • 在Python中通过sys.stdout写入unicode字符串

      暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
    • Pandas:合并多个数据框并控制列名称?

      我想将九个 Pandas 数据帧合并到一个数据帧中 对两列进行联接 控制列名称 这可能吗 我有九个数据集 它们都有以下列 org name items spend 我想将它们加入到具有以下列的单个数据框中 org name items df
    • 如何测试send_file烧瓶

      我有一个小型烧瓶应用程序 它需要上传一些图像并将它们转换为多页 tiff 没什么特别的 但是如何测试多个文件的上传和文件下载呢 我的测试客户端 class RestTestCase unittest TestCase def setUp s

    随机推荐