Visual studio 2012 Pyside和Cython
我已经用pyside编写了一个GUI,但是当我使用Cython和visualstudio编译应用程序时,我遇到了一些问题。此应用程序(exe)每次都会崩溃,并且没有指示是什么导致了它 但是,如果我使用pyexe来制作一个应用程序,那么一切都会顺利进行,并且这个应用程序能够正常工作。Cython和visual studio有什么问题 示例代码Visual studio 2012 Pyside和Cython,visual-studio-2012,python-2.7,pyside,cython,Visual Studio 2012,Python 2.7,Pyside,Cython,我已经用pyside编写了一个GUI,但是当我使用Cython和visualstudio编译应用程序时,我遇到了一些问题。此应用程序(exe)每次都会崩溃,并且没有指示是什么导致了它 但是,如果我使用pyexe来制作一个应用程序,那么一切都会顺利进行,并且这个应用程序能够正常工作。Cython和visual studio有什么问题 示例代码 import sys from PySide.QtCore import * from PySide.QtGui import * class Main
import sys
from PySide.QtCore import *
from PySide.QtGui import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
layout = QVBoxLayout()
self.setLayout(layout)
self.line_edit = QLineEdit()
layout.addWidget(self.line_edit)
self.output = QTextEdit()
layout.addWidget(self.output)
font = self.output.font()
font.setFamily("Lucida Console")
font.setPointSize(10)
font.setStyleHint(font.Monospace)
font.setStyleStrategy(font.PreferAntialias)
self.output.setCurrentFont(font)
self.line_edit.returnPressed.connect(self.line_edit_text_changed)
self.output.append("{:<16.4}{:<16.6}".format(10.23, 1235.77265))
self.output.append("{:<16.4}{:<16.6}".format(10.23, 12.345))
self.show()
def line_edit_text_changed(self):
self.output.append(self.line_edit.text())
app = QApplication(sys.argv)
mw = MainWindow()
app.exec_()
导入系统
从PySide.QtCore导入*
从PySide.QtGui导入*
类主窗口(QWidget):
定义初始化(自):
QWidget.\uuuuu初始化(自)
layout=QVBoxLayout()
self.setLayout(布局)
self.line_edit=QLineEdit()
layout.addWidget(self.line\u编辑)
self.output=QTextEdit()
layout.addWidget(self.output)
font=self.output.font()
font.setFamily(“Lucida控制台”)
字体设置点大小(10)
font.setStyleHint(font.Monospace)
font.setStyleStrategy(font.PreferAntialias)
self.output.setCurrentFont(字体)
self.line\u edit.returnPressed.connect(self.line\u edit\u text\u已更改)
self.output.append(“{:好的,下面是我所做的: 我的台词是
signal.connect( self.function )
把它们变成
connector = lambda : self.function
signal.connect( connector )
正如我所知,问题在于Cython如何将函数转换为可从Python调用的C。它与Signal connect用于管理Python和C之间调用的hack不太兼容。因此,我要做的是创建一个Python函数对象(lambda函数)并将其用作Python对象
调用Cython函数是令人高兴的,因为您使用典型的Python语法调用它。连接信号是令人高兴的,因为它有一个普通的Python函数
我使用您的示例对此进行了测试,并使用以下行进行了更改:
con = lambda : self.line_edit_text_changed()
self.line_edit.returnPressed.connect( con )
编辑:为了使我的生活更简单,我还创建了一个函数来处理其中的一些问题
def connect_signal( signal, function ):
def intermediary( *args, **kwargs ):
function( *args, **kwargs )
signal.connect( intermediary )
这可以放在一些常用的文件中,用来代替常用的语法。它适用于Cythonized和non-Cythonized文件。好的,下面是我所做的: 我的台词是
signal.connect( self.function )
把它们变成
connector = lambda : self.function
signal.connect( connector )
正如我所知,问题在于Cython如何将函数转换为可从Python调用的C。它与Signal connect用于管理Python和C之间调用的hack不太兼容。因此,我要做的是创建一个Python函数对象(lambda函数)并将其用作Python对象
调用Cython函数是令人高兴的,因为您使用典型的Python语法调用它。连接信号是令人高兴的,因为它有一个普通的Python函数
我使用您的示例对此进行了测试,并使用以下行进行了更改:
con = lambda : self.line_edit_text_changed()
self.line_edit.returnPressed.connect( con )
编辑:为了使我的生活更简单,我还创建了一个函数来处理其中的一些问题
def connect_signal( signal, function ):
def intermediary( *args, **kwargs ):
function( *args, **kwargs )
signal.connect( intermediary )
这可以放在一些常见的文件中,用来代替常用的语法。它适用于Cythonized和非Cythonized文件。我目前遇到一个问题,Python连接信号似乎产生了分段错误。Pyside/Cython似乎有一个bug?…我试着用Cython编译我的应用程序,但有些函数PySide的可选性不起作用。请看,我目前遇到一个问题,Python信号的连接似乎产生了分段错误。PySide/Cython似乎有一个bug?…我曾尝试用Cython编译我的应用程序,但PySide的一些功能不起作用。请看几个月后,我确定了一个非常重要的错误回到这个方法;也就是说,连接的函数没有被正确解构。因为中介是它自己的对象,所以在解构函数时它不会被解构。当一个连接了函数的对象被破坏时,这可能会导致各种问题。我已经将我的项目从Cython迁移出去,所以我没有找到了解决这个问题的方法。几个月后,我发现了这个方法的一个非常重要的缺点,即连接的函数没有被正确解构。因为中介体是它自己的对象,所以在解构函数时它不会被解构。当一个对象我已经将我的项目从Cython迁移出去了,所以我还没有找到解决这个问题的方法。