【问题标题】:Creating a button with a Bitmap image wxPython使用位图图像 wxPython 创建一个按钮
【发布时间】:2018-02-06 23:20:34
【问题描述】:

我在 Python 2.7 上使用 wxPython。 我需要一些关于创建带有位图图像的按钮的帮助。

我正在使用这个视频https://www.youtube.com/watch?v=Y7f0a7xbWHI, 我按照代码输入了

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Frame aka window',size=(300,200))
        panel=wx.Panel(self)

        pic=wx.Image("back.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        self.button=wx.BitmapButton(panel, -1, pic, pos=(10,10))
        self.Bind(wx.EVT_BUTTON, self.doMe, self.button)
        self.button.SetDefault()

    def doMe(self, event):
        self.Destroy

创建一个带有图像的按钮。我收到一条错误消息,指出图像无效。 我将位图图像保存在包含我正在使用的 .py 文件的文件夹中。 我觉得我将图像保存在错误的位置? 先感谢您。

我收到的错误

Traceback (most recent call last):
  File "C:\Python27\FrameWindow.py", line 81, in <module>
    frame=bucky(parent=None,id=-1)
  File "C:\Python27\FrameWindow.py", line 17, in __init__
     pic=wx.Image("back.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
  File "C:\Python27\lib\site-packages\wx\core.py", line 708, in _Image_ConvertToBitmap
    bmp = wx.Bitmap(self, depth)
wxAssertionError: C++ assertion "image.IsOk()" failed at ..\..\src  \msw\bitmap.cpp(922) in wxBitmap::CreateFromImage(): invalid image

【问题讨论】:

  • 包含您收到的错误非常有帮助,这样其他人可以通过 Google 搜索错误消息并找到它。
  • 感谢您告诉我。我是这里的菜鸟。我刚刚添加了错误代码。

标签: python python-2.7 wxpython


【解决方案1】:

我通过添加让它工作

"locale = wx.Locale(wx.LANGUAGE_ENGLISH)"

class MainFrame(wx.Frame):
    def __init__(self):

现在我没有收到错误消息,它可以正常运行。 我收到的这个问题的错误代码是:

Traceback (most recent call last):
   File "C:\Python27\panel test.py", line 21, in <module>
      frame = MainFrame()
   File "C:\Python27\panel test.py", line 11, in __init__
      pic = wx.Bitmap("back.bmp", wx.BITMAP_TYPE_ANY)
 wxAssertionError: C++ assertion "strcmp(setlocale(LC_ALL, NULL), "C") == 0" failed at ..\..\src\common\intl.cpp(1579) in wxLocale::GetInfo(): You probably called setlocale() directly instead of using wxLocale and now there is a mismatch between C/C++ and Windows locale.
 Things are going to break, please only change locale by creating wxLocale objects to avoid this!

我的主要问题给出的错误已由 Rolf by Saxony 给出的代码解决。

【讨论】:

  • 您可以通过单击旁边的勾号来接受答案。您可以分别单击旁边的向上/向下箭头将答案标记为有用或无用。或者你可以接受你自己的答案(但你不会得到任何分数)。这是你的电话。
【解决方案2】:

使用wx.BITMAP_TYPE_ANY 而不是wx.BITMAP_TYPE_BMP 它可以猜测它是否真的是BMP
或者直接使用wx.Bitmap()

import wx

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'Frame aka window',size=(300,200))
        panel=wx.Panel(self)
        #
        # Use wx.BITMAP_TYPE_ANY rather than wx.BITMAP_TYPE_BMP
        #
        #pic=wx.Image("Discord.bmp", wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        #
        # or use wx.Bitmap()
        pic = wx.Bitmap("Discord.bmp", wx.BITMAP_TYPE_ANY)
        #
        self.button=wx.BitmapButton(panel, -1, pic, pos=(10,10))
        self.Bind(wx.EVT_BUTTON, self.doMe, self.button)
        self.Show()

    def doMe(self, event):
        self.Destroy()

if __name__ == "__main__":
      app = wx.App()
      frame = MainFrame()
      app.MainLoop()

原则上,您应该使用完整路径名来命名您的图像。如果您有许多图像,则在使用图像时将图像目录和join 该目录名称添加到图像名称中,这再次为您提供了完整路径(/home/images/back_button.bmp)

【讨论】:

  • 感谢您的回答,我尝试了您的方法,现在它显示“wxAssertionError: C++ assertion "strcmp(setlocale(LC_ALL, NULL), "C") == 0" failed at ..\ ..\src\common\intl.cpp(1579) in wxLocale::GetInfo(): 你可能直接调用了 setlocale() 而不是使用 wxLocale,现在 C/C++ 和 Windows 语言环境不匹配。事情将会发生打破,请仅通过创建 wxLocale 对象来更改语言环境以避免这种情况!”在这种情况下我该怎么办?
  • 不知道。从代码中可以看出,我上面的简单代码在 Linux Mint 18.3 上运行良好,不涉及语言环境。运行上面的代码是否发生错误,或者您是否将更改应用于您的代码?如果后者尝试仅将上面的代码作为独立程序运行(显然要更改图像的名称)
  • 是的,我尝试按照我的图像运行您的代码。是否有任何特定的地方需要保存我的图像以在 wxPython 上使用??
  • 另外,当我不在 IDLE 上运行模块时,我的代码似乎正在工作,但左键单击文件夹中的 .py 文件名。当我在 IDLE 上“运行模块”时显示错误消息,但是当我左键单击文件名时,它有我的图片并且一切似乎都在工作。
  • 我对 IDLE 一无所知。我从命令行编码。原则上,您应该使用完整路径名命名您的图像。如果您有许多图像,则在使用图像时将图像目录和join 该目录名称添加到图像名称中,这再次为您提供了完整路径(/home/images/back_button.bmp)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多