wxpython skin bug(弹出菜单,内存错误)

使用wxPython设置主窗口的背景图片 在使用wxPython创建GUI应用程序时,我们经常需要自定义窗口的外观,其中一个常见需求是设置窗口的背景图片。本文将介绍如何使用wxPython库在主窗口中设置背景图片,并提供相应的源代码。你可以根据自己的需求,调整窗口的大小、添加其他控件等。在这个示例中,我们假设背景图片文件名为"background.jpg",你可以将其替换为你自己的图片文件名。类的构造函数中,我们首先调用父类的构造函数来初始化窗口的基本属性,例如标题和大小。运行上述代码,你将会看到一个带有背景图片的主窗口显示出来。 阅读详情

前面说到了 wxpython skin的问题(使用皮肤后弹出目录,程序崩溃)

http://blog.youkuaiyun.com/xugangjava/article/details/7763212

使用OllyDbg 调试 发现在wxwindow中的 handlermenuchar 报错了,非法的地址访问,


一下也看不出来是为什么,还好wxpython是开源的,网上下载源码。

我下载的是2.9.4 最新版,我建议下载这个版本,官方的说法是development 版本的并非bug更多,只是文档跟API未能跟上而已,

wxpython2.9编译非常简单,在vc 2008命令提示符 下运行 wxpython目录中的 build_wxpython.py 就 OK了

详细可以参考http://wxpython.org/BUILD.html


打开源码查看 core 工程目录下的 MSW Sources

打开windows.cpp 5805行

#if wxUSE_MENUS
int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel),
                                WXLPARAM WXUNUSED_IN_WINCE(lParam))
{
    // FIXME: implement GetMenuItemCount for WinCE, possibly
    // in terms of GetMenuItemInfo
#ifndef __WXWINCE__
    const HMENU hmenu = (HMENU)lParam;

    WinStruct<MENUITEMINFO> mii;

    // we could use MIIM_FTYPE here as we only need to know if the item is
    // ownerdrawn or not and not dwTypeData which MIIM_TYPE also returns, but
    // MIIM_FTYPE is not supported under Win95
    mii.fMask = MIIM_TYPE | MIIM_DATA;

    // find if we have this letter in any owner drawn item
    const int count = ::GetMenuItemCount(hmenu);
    for ( int i = 0; i < count; i++ )
    {
        // previous loop iteration could modify it, reset it back before
        // calling GetMenuItemInfo() to prevent it from overflowing dwTypeData
        mii.cch = 0;

        if ( ::GetMenuItemInfo(hmenu, i, TRUE, &mii) )
        {
            if ( mii.fType == MFT_OWNERDRAW )
            {
                //  dwItemData member of the MENUITEMINFO is a
                //  pointer to the associated wxMenuItem -- see the
                //  menu creation code
                wxMenuItem *item = (wxMenuItem*)mii.dwItemData;

                const wxString label(item->GetItemLabel());
                const wxChar *p = wxStrchr(label.t_str(), wxT('&'));
                while ( p++ )
                {
                    if ( *p == wxT('&') )
                    {
                        // this is not the accel char, find the real one
                        p = wxStrchr(p + 1, wxT('&'));
                    }
                    else // got the accel char
                    {
                        // FIXME-UNICODE: this comparison doesn't risk to work
                        // for non ASCII accelerator characters I'm afraid, but
                        // what can we do?
                        if ( (wchar_t)wxToupper(*p) == (wchar_t)chAccel )
                        {
                            return i;
                        }
                        else
                        {
                            // this one doesn't match
                            break;
                        }
                    }
                }
            }
        }
        else // failed to get the menu text?
        {
            // it's not fatal, so don't show error, but still log it
            wxLogLastError(wxT("GetMenuItemInfo"));
        }
    }
#endif
    return wxNOT_FOUND;
}

const wxString label(item->GetItemLabel()); 这里报错,内存冲突

看来mii.dwItemData强转成wxMenuItem 调用GetItemLabel时造成了无效的内存访问。

重新实现这一段代码,使用GetMenuString来得到,Menu的 Text 然后跟用户按键比较。

#if wxUSE_MENUS
int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel),
                                WXLPARAM WXUNUSED_IN_WINCE(lParam))
{
    // FIXME: implement GetMenuItemCount for WinCE, possibly
    // in terms of GetMenuItemInfo
#ifndef __WXWINCE__
    const HMENU hmenu = (HMENU)lParam;

	//xugangjava fixed
	WinStruct<MENUITEMINFO> mii;
	mii.fMask = MIIM_TYPE | MIIM_DATA;
	const int count=::GetMenuItemCount(hmenu);
	wchar_t itemText[255];
	for(int itemIdx=0;itemIdx<count;itemIdx++)
	{
		if ( ::GetMenuItemInfo(hmenu, itemIdx, TRUE, &mii) )
		{
			 if ( mii.fType == MFT_OWNERDRAW )
			 {
				 int textLen  =::GetMenuStringW(hmenu,itemIdx,itemText,255,MF_BYPOSITION);
				 if(!textLen)continue;
				 for(int strIdx=0;strIdx<textLen;strIdx++)
				 {
					if(itemText[strIdx]==L'&')
							continue;
					else if (itemText[strIdx] == (wchar_t)chAccel)
							return itemIdx;
					else
							break;
				 }
			 }
		}
		else // failed to get the menu text?
		{
			// it's not fatal, so don't show error, but still log it
			wxLogLastError(wxT("GetMenuItemInfo"));
		}
	}

	/* bug   
    // we could use MIIM_FTYPE here as we only need to know if the item is
    // ownerdrawn or not and not dwTypeData which MIIM_TYPE also returns, but
    // MIIM_FTYPE is not supported under Win95
    mii.fMask = MIIM_TYPE | MIIM_DATA;

    // find if we have this letter in any owner drawn item
    const int count = ::GetMenuItemCount(hmenu);
    for ( int i = 0; i < count; i++ )
    {
        // previous loop iteration could modify it, reset it back before
        // calling GetMenuItemInfo() to prevent it from overflowing dwTypeData
        mii.cch = 0;

        if ( ::GetMenuItemInfo(hmenu, i, TRUE, &mii) )
        {
            if ( mii.fType == MFT_OWNERDRAW )
            {
                //  dwItemData member of the MENUITEMINFO is a
                //  pointer to the associated wxMenuItem -- see the
                //  menu creation code
                wxMenuItem *item = (wxMenuItem*)mii.dwItemData;

                const wxString label(item->GetItemLabel());
                const wxChar *p = wxStrchr(label.t_str(), wxT('&'));
                while ( p++ )
                {
                    if ( *p == wxT('&') )
                    {
                        // this is not the accel char, find the real one
                        p = wxStrchr(p + 1, wxT('&'));
                    }
                    else // got the accel char
                    {
                        // FIXME-UNICODE: this comparison doesn't risk to work
                        // for non ASCII accelerator characters I'm afraid, but
                        // what can we do?
                        if ( (wchar_t)wxToupper(*p) == (wchar_t)chAccel )
                        {
                            return i;
                        }
                        else
                        {
                            // this one doesn't match
                            break;
                        }
                    }
                }
            }
        }
        else // failed to get the menu text?
        {
            // it's not fatal, so don't show error, but still log it
            wxLogLastError(wxT("GetMenuItemInfo"));
        }
	
    }
		*/
#endif
    return wxNOT_FOUND;
}

Ok 经过测试后 皮肤可以用了,没有内存崩溃,

现在 Wxpython 也可以做出QQ 的效果了,虽然有些地方没有渲染到位,不过整体还是可以的

(我用的是SkinSharp,向大家推荐一下)






Python桌面应用程序中的界面美化与定制 通过选择合适的GUI框架、使用自定义样式表、定制主题颜色以及使用自定义控件和小部件等方式,可以为应用程序添加一个美观、易用的用户界面。这些自定义控件和小部件可以与框架提供的控件和小部件无缝集成,从而扩展应用程序的功能和外观。可以使用框架提供的布局管理器(如PyQt中的QVBoxLayout和QHBoxLayout)来自动对齐UI元素,也可以手动指定UI元素的位置和大小。在布局和对齐时,应该遵循一定的设计原则,如对称性、平衡性和一致性,以便用户更容易理解界面和交互。在选择字体时,应该考虑其易读性和可访问性。 阅读详情

相关推荐

STM32外围电路硬件解析

复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时,

qq_39577221的博客 1万+

wxpython skin bug(staticbox背景绘制)

用了皮肤bug真多,staticbox 不能用,背景成了透明的,而且拖动大小后背景不会刷新。成了下面的效果 还好手头有源代码,只有慢慢看源码,找原因了。 bool wxStaticBox::Create(wxWindow *parent, wxWindowID id, const w

xugangjava的专栏 3922

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 561

wxpython漂亮gui界面模板下载_Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮)...

Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮)实现界面实现代码import wxclass MyPanel(wx.Panel):def __init__(self, parent, id):wx.Panel.__init__(self, parent, id)try:image_file = 'F:/File_Python/Python_GUI/Talking W...

weixin_39603598的博客 1281

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4400

U盘无法识别?一条命令轻松修复,数据不丢失

问题描述 U盘经常会遇到提示:无法识别或者需要重新格式等问题,例如下图 修复方法 WIN+R输入cmd 输入chkdsk+盘符:/F /F是修复的意思 更多内容 U盘无法识别或提示需要格式化?别急着格式化丢失数据!本文教你使用Windows自带的命令快速修复U盘文件系统错误,简单几步就能解决问题,让你的U盘恢复正常使用💾✨

XiaoqiangClub的博客 637

python gui 之 wxPython的样式

在 wxPython 中,设置 widget 的颜色、圆角、边框等样式通常涉及使用特定的方法和属性。

nujnus9221的博客 1179

把 LangGraph 当“工作流引擎”用:与传统 BPM 的差异与融合策略

首先,我们来回顾一下有限状态机(FSM)的基本定义——一个 FSM 可以用一个五元组MQΣδq0FMQΣδq0​FQQQ有限状态集合,包含 FSM 所有可能的状态;Σ\SigmaΣ有限输入字母表,包含 FSM 所有可能的输入;δ\deltaδ状态转移函数,定义了 FSM 从当前状态q∈Qq \in Qq∈Q接收输入σ∈Σσ∈Σ后,转移到的下一个状态q′∈Qq' \in Qq′∈Q,即δQ×Σ→QδQ×Σ→Q。

AI 原生应用开发的博客 227

用wxpython做ui_wxpython gui美化方案?

看到问题的所有回答以及楼主和@Sunny的互动以及楼主分享的代码,感觉知乎上好凄凉啊!最近刚转到python,了解使用了tkiner和wxpython,个人感觉无论tkiner和wxpython做ui确实太弱了,ui的可控性和稳定性甚至连java的swing都不如,了解期间竟然还被我这样的python初级开发者找出模块一个bug(与wxpython有关但不是wxpython的,不过wxpython...

weixin_39827585的博客 605

Avalonia 超级详细学习指南

什么是 Avalonia?Avalonia 是一个开源的、跨平台的 GUI 框架,允许开发者使用 XAML 和 C# 构建现代化、高性能的桌面应用程序。与其他框架相比,Avalonia 具有强大的跨平台能力和灵活的界面设计。} }()Avalonia 的特点和优势跨平台性:Avalonia 可以在 Windows、Linux、macOS 等多个平台上运行,开发者可以编写一套代码,然后在不同的操作系统上运行相同的应用程序。

仰望星空的博客 1万+

基于R-CNN深度学习的常见手势识别系统:数据集、模型和UI界面的完整实现

卷积神经网络(CNN):用于从图像中提取特征。区域提议网络(RPN):用于生成可能包含手势的候选区域。:将候选区域调整为固定大小,并进行进一步的分类和回归。接下来,我们需要加载一个预训练的Faster R-CNN模型,并对其进行微调。我们将使用# 加载预训练的Faster R-CNN模型# 获取分类器的输入特征数# 替换分类器头部,设置为我们数据集的类别数(假设有5类手势)

YOLO 998

wxpython 优秀的界面_好用的 wxPython 界面設計工具 — wxFormBuilder

在測試過程中,我們常常透過終端機執行指令,來完成一些事情。這些常用的指令,久了可能會忘,我們可以提供一個整合的介面,方便大家使用。另外,現有自動化測試已經包含了一連串的 test case。有時我們不需要跑一整套,只需要跑部分的 test case。這時如果有一個介面可以方便提供勾選,指定要執行的 test case,會方便很多。除此之外,測試結果可以直接匯總後顯示在 UI 介面上,會比較直覺。基...

weixin_39716043的博客 532

通过实例讲解瀑布模型

在电子商城开发中,瀑布模型如同 “工业时代的流水线”—— 能通过标准化流程交付高质量、高合规性的系统,但也可能因缺乏灵活性而错失市场机会。其优势与缺点本质上源于同一核心特征:严格的阶段性与文档驱动。决策建议若开发传统型、长周期、需求固定的电子商城(如企业内部采购平台),可优先选择瀑布模型,并通过 “需求预验证 + 模块化设计” 降低风险;若开发创新型、短周期、需快速迭代的电商平台(如社交电商、跨境电商),建议采用敏捷模型或混合模型(如瀑布 + Scrum),平衡规范性与响应速度。

跟佟格湾一起学习计算机知识吧~ 271

wxpython skin sharp的问题

wxpython使用 Skin Sharp 皮肤后一切正常 但是 在弹出目录的 同时点击键盘按键 程序出现 memory不能为written错误 ????

xugangjava的专栏 2017

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python学习笔记——wxPython 4.2.0终于发布了

2022年8月7日0点,wxPython团队发布了最新版本wxPython 4.2.0。距离上次wxPython 4.1.1发布时间(2020年11月21日)有点长,很多人以为它已经不再更新了。wxPython团队在主页上写了一名比较幽默的话“Rumors of my death are only slightly exaggerated”。.........

cc的专栏 2859

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

好看的wxpython界面_最简单的wxPython的界面设计

#!/bin/env python# -*- coding: utf-8 -*-##################################################################################这个测试程序有助于我们理解wxPython的界面设计,基本的控件和事件调用都有#######################################...

weixin_30097621的博客 1124

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

wxpython精美界面_Python_GUI学习笔记(3)wxPython的简单界面设计

第一次接触到wxpython,在网上找到一个简单的界面显示代码,复制到spyder3编辑中进行运行出现错误,(“module 'wx' has no attributte 'App'”),但在python3.6的IDLE编辑器上运行没有错误。具体程序以下:htmlimport wxapp = wx.App()frame = wx.Frame(None,title="my GUI")frame.Sh...

weixin_39964590的博客 1225

wxpython设置背景颜色_在wxpython中设置背景图像

我在wxpython有一些令人困惑的行为。我刚刚将最新版本(3.0.0.0)加载到了带有Python2.6.6的RHEL6.4中。在大多数事情似乎都能正常工作,但我之前运行带有背景图像的gui的代码失败了。所有的按钮都可以工作,等等,但是背景只是默认的灰色。在我试着从Mike Driscoll的python网站(http://www.blog.pythonlibrary.org/2010/03/1...

weixin_32818587的博客 1369

wxPython界面开发总结

本文总结了快速学习wxPython界面编程的知识要点

阿丹的彩蛋 2万+

WxPython的颜色名字列表

下面這個python程式可以產生wxPython color name的列表。這樣可以方便撰寫程式的時候查詢color name。#!/usr/bin/env pythonimport sysimport wxapp = wx.App()if len(sys.argv) >= 2: fd = file(sys.argv[1], w)else

自在 的专栏 9863

wxPython入门中文版 (Getting Started with wxPython)

本文翻译自http://wiki.wxpython.org/Getting%20Started 首先声明:本人还是个菜鸟,翻译只是为了学习,就当作记笔记了。水平有限,错误和疏漏在所难免,希望各路高手能够给予指导。而且简单查了一下,好像中文世界目前还没有完整的翻译 Getting Started with wxPython 的。wxPython入门第一个应用程序:”Hello, World!”按惯例

然后呢 11万+

Python3 wxPython库

Python3 wxPython库 这个第三方库用于开发跨平台的 GUI 应用程序,可以轻松地创建健壮、功能强大的 GUI 程序。通过 pip install wxPython 命令下载 wxPython 库。 Hello World 下面是业余版本的 Hello World: # 导入wxPython库 import wx # 创建一个应用程序对象 app = wx.App() # 创建一个框架 frm = wx.Frame(None, title="Hello World") # 展示框架 frm.

咖啡花园 5288

wxPython实现仿QQ登录界面

蛋疼 ,全部自己画 下面主要是按钮的实现,绑定键盘鼠标事件 当UP的时候 发送EVT_BUTTON 消息,比较难得就是实现面板默认按钮 在输入框的时候,点击回车 发送按钮实现 这里用Panel BIND EVT_CHAR_HOOK来实现,得到EVT_CHAR_HOOK时发生按钮点击事件 class AbstractButton(wx.Window): def __init__(self

xugangjava的专栏 9104
上一篇: adodbapi orm对象查询(四)
下一篇: python 动态修改代码
xugangjava
博客等级 码龄16年 83粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值