我有一个依赖外部配置文件的 wxPython 应用程序。我想提供友好的消息对话框,如果有任何配置错误,就会显示该对话框。我尝试通过将 app.MainLoop() 调用包装在 try/ except 语句中来完成这项工作。
下面的代码适用于我的 MainWindow 框架类中的初始化代码,但不会捕获 MainLoop 中发生的任何异常。我怎样才能捕获这些异常呢?
if __name__ == '__main__':
app = MyApp(0)
try:
MainWindow(None, -1, 'My Cool App')
app.MainLoop()
except ConfigParser.Error, error_message:
messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
messagebox.ShowModal()
Run Code Online (Sandbox Code Playgroud)
我读过一些关于可以在 wx.App 类中重写的 OnExceptionInMainLoop 方法的内容,但我读到的源代码必须已过时(2004 年),因为 wx.App 似乎不再具有该名称的方法。
编辑:
我需要能够在主循环期间捕获未处理的异常,以便我可以进一步处理它们并将它们显示在错误对话框中,而不是静默传递,并且不终止应用程序。
sys.excepthook 解决方案级别太低,并且与 wxPython 主循环线程不能很好地配合。虽然到另一个答案的链接做了相同的尝试/除了环绕主循环,但由于 wxPython 再次为应用程序/ui 生成了不同的线程,所以它不起作用。
当用户单击 wxTextCtrl 时是否有一种简单的方法来处理?阅读文档wxTextCtrl后,我发现没有单击或双击事件。我从问题wxWidgets:检测自定义控件上的单击事件中了解到 wxWidgets 中没有“单击”事件之类的东西,因此一个简单的鼠标按下事件就可以了。
示例答案:
来自:wx 维基
textCtrl->Connect(wxEVT_LEFT_DOWN,
wxMouseEventHandler(MyClass::OnClick), NULL, this );
Run Code Online (Sandbox Code Playgroud) 我们正在销售用 wxWidgets 开发的图像处理应用程序(大约 12 万行代码)。我们计划一切尽可能跨平台,以防需要从 Windows 移植到其他操作系统。事实上,我们将实现一个 Mac 版本。我们还没有在 Mac 上测试 wxWidest,但我们还没有读到关于它的很好的东西。
总的来说,你认为从 wxWidgets 移植到 QT 值得吗?你相信这将是一项艰巨而漫长的工作吗?
QT for Mac 是否比 wxWidgets 实现好得多?
QT 是不是比 wxWidgets 更有效率?
我想补充一点,我们不想保留 gui 的代码库,所以选择只是 wxWidgets 与 QT。
我使用wxWidgets,我调用函数需要很长时间才能继续.我想在后台做.
我怎样才能做到这一点?
感谢帮助
这是一个概念验证问题。我正在设计一个 GUI,用于在飞行模拟应用程序中编辑空中交通参与者的航路点。在当前的概念中,所选航路点的参数显示在一堆文本框中。该输入掩码既充当数据视图又充当编辑掩码。编辑字段后,用户可以:
如果仅需要为新路径点更改某些参数子集,则此设计可以避免重新输入数据。
只有一个问题:在哪里插入路径点?我的答案是“另存为新”按钮上的下拉菜单,其中包含以下菜单项:
最后一项是棘手的。索引位置需要由用户输入,我想避免弹出窗口只要求单个值。
我的想法是:将文本框嵌入到菜单项中。
这种方法在 QT 或 wxWidgets 中可行吗?您对 GUI 设计有何看法?
问候,阿恩
PS:请注意,这一切都处于概念阶段。该小组甚至还没有决定使用哪种 GUI 框架:Qt 或 wxWidgets。
我有一个关于如何构建与 GUI 对象相关的代码的问题。假设我有一个对话框,它有一个列表控件,该控件有一堆从数据库中获取的名称。用户可以编辑名称。逻辑是驻留在该对话框类中还是应该来自外部。为了说明我的意思,这里有一些伪代码显示了在对话框类之外处理逻辑时的代码结构:
NamesDialog : wxDialog
{
Private:
..stuff..
Public:
...
SetNames(wxStringArray names);
wxStringArray GetNames();
..stuff..
}
Run Code Online (Sandbox Code Playgroud)
因此,该类的用户会执行以下操作:
wxStringArray names = DatabaseManager::Get()->GetNames();
names.Sort();
NamesDialogObject.SetNames(names);
NamesDialogObject.ShowModal();
wxStringArray modified_names = NamesDialogObject.GetNames();
AddToDatabase(modified_names); //or something like this.
Run Code Online (Sandbox Code Playgroud)
另一方面,数据库逻辑可以驻留在NamesDialog 类本身中。在 show 方法中,我可以查询数据库的名称,并且当用户与控件(在本例中为列表控件)交互时,可以从事件处理程序更新数据库。因此 NamesDialog 类只有 Show() 方法,因为不需要使用 SetNames 或 GetNames() 等。
通常首选哪种方法?我没有太多的工作经验,所以我不确定哪种是处理它的正确方法。有时,处理类中的所有内容更容易,但访问与之交互的对象可能具有挑战性。通常可以通过让相关对象像上面示例中的数据库管理器一样成为单例来实现。
我在线程中使用 wxHTTP 时遇到了一些问题。我创建了以下从 wxThread 派生的类来使用 wxHTTP。
class Thread : public wxThread {
private:
wxHTTP get;
public:
Thread()
{
}
~Thread()
{
}
virtual ExitCode Entry()
{
get.SetHeader(wxT("Content-Type"), wxT("text/html; charset=utf-8"));
get.Connect(wxT("www.mysite.com"));
get.SetTimeout(1);
wxInputStream *httpStream = get.GetInputStream(wxT("/script.php?name=aaa&text=blabla"));
wxDELETE(httpStream);
get.Close();
return 0;
}
};
Run Code Online (Sandbox Code Playgroud)
我创建了这个线程并运行它(线程被创建、运行并且一切都很好)。不幸的是,wxHTTP 似乎不能与线程一起正常工作(即使我的防火墙也没有询问我关于连接的问题)。有没有办法在线程内创建 wxHTTP 连接?
现在,我正在像这样设置背景颜色,
dc.DrawRectangle(0,0,width,height)
你知道设置背景颜色的更好方法吗?
我有以下情况:
我对 CMake 很陌生,我目前面临的问题是:我的应用程序中的源文件找不到 wx 包含文件,我需要设置正确的链接器标志才能将我的应用程序链接到 wxwidgets。
这似乎是由实用程序“wx-config”处理的,该实用程序在使用 --cppflags 或 --libs 标志运行时提供该信息作为输出。但是,我无法弄清楚如何捕获该输出并将其附加到我从 CMakeLists.txt 文件设置的包含目录和链接库中。
所以基本上我想要的是。
到目前为止,我已经尝试过这样的事情:
# Set a target-configuration-specific location
set(wxwidgetsTop ${MYPROJECT_EXTERNAL_DIR}/wxwidgets/wxwidgets_${MYPROJECT_CURRENT_TARGET_CFG})
# Build the project
ExternalProject_Add( wxWidgetsExternal
PREFIX ${wxwidgetsTop}
URL ${MYPROJECT_EXTERNAL_DIR}/tarballs/wxWidgets-3.0.2.tar.bz2
SOURCE_DIR ${wxwidgetsTop}/src/wxwidgets
CONFIGURE_COMMAND ${configure_cmdline}
BUILD_COMMAND make -j${MYPROJECT_NCPU}
INSTALL_COMMAND make install
)
# Create a wxwidgets target to be used as a dependency …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译使用 wxWidgets 库创建的现有项目。我成功编译了 wxWidgets 2.8.12 库。现在,我正在尝试编译我的项目。但我得到错误:
fatal error LNK1104: cannot open file 'wxbase28d.lib'
Run Code Online (Sandbox Code Playgroud)
之后我在设置中添加了一些变量,例如:
C/C++->预处理器定义:
WIN32;__WXMSW__;_WINDOWS;_DEBUG;__WXDEBUG__;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
Run Code Online (Sandbox Code Playgroud)
VC++ 目录->包含目录:
D:\instantclient_12_1\sdk\include;$(WXWIN)\lib\vc_lib\mswd;$(WXWIN)\include;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;
Run Code Online (Sandbox Code Playgroud)
链接器->常规->附加库目录:
$(WXWIN)\lib\vc_lib;E:\app\vasyl\product\11.1.0\db_1\OCI\lib\MSVC\vc71;$(WXDIR284)\lib\vc_lib;%(AdditionalLibraryDirectories)
Run Code Online (Sandbox Code Playgroud)
资源->常规->其他包含目录:
$(WXWIN)\include;c:\wxMSW284\include;$(WXDIR284)\include;%(AdditionalIncludeDirectories)
Run Code Online (Sandbox Code Playgroud)
现在,情况是这样的:
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgfree.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _realloc already defined in LIBCMTD.lib(dbgrealloc.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _memmove already defined in LIBCMTD.lib(memmove.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _tolower already defined in LIBCMTD.lib(tolower.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _isalpha already defined in LIBCMTD.lib(_ctype.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : …Run Code Online (Sandbox Code Playgroud)