1

我有一组可用的图像。如果我单击其中一个图像,是否可以确定在 wxPython 中单击了哪些图像?

4

2 回答 2

3

您几乎可以肯定必须自己计算。最直接的方法是使用 wx.EVT_LEFT_DOWN 之类的鼠标事件并在事件处理程序中获取鼠标的坐标。然后使用该信息告诉您单击 wxPython 窗口的哪个位置。您的每个图像小部件或 DC 或您正在使用的任何东西都可以报告它的大小和位置,因此如果鼠标坐标在 X 图像的边界内,您就知道它已被点击。您可能还可以使用 HitTest() 方法,具体取决于您用于显示图像的内容。

编辑:如果你使用 wx.StaticBitmap,你会这样做,它实际上可以让你附加一个 wx.EVT_LEFT_DOWN 到它:

import wx

class PhotoCtrl(wx.Frame):
    def __init__(self):
        size = (400,800)
        wx.Frame.__init__(self, None, title='Photo Control', size=size)

        self.panel = wx.Panel(self)


        img = wx.EmptyImage(240,240)
        self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, 
                                         wx.BitmapFromImage(img),
                                         name="emptyImage")
        imageCtrl2 = wx.StaticBitmap(self.panel, wx.ID_ANY, 
                                     wx.BitmapFromImage(img),
                                     name="anotherEmptyImage")

        self.imageCtrl.Bind(wx.EVT_LEFT_DOWN, self.onClick)
        imageCtrl2.Bind(wx.EVT_LEFT_DOWN, self.onClick)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(self.imageCtrl, 0, wx.ALL, 5)
        mainSizer.Add(imageCtrl2, 0, wx.ALL, 5)

        self.panel.SetSizer(mainSizer)
        self.Show()

    #----------------------------------------------------------------------
    def onClick(self, event):
        """"""
        print event.GetPosition()
        imgCtrl = event.GetEventObject()
        print imgCtrl.GetName()


if __name__ == '__main__':
    app = wx.App(False)
    frame = PhotoCtrl()
    app.MainLoop()
于 2013-04-04T17:38:22.943 回答
0

您没有告诉我们有关您如何显示图像的任何信息吗?你是在直流电上把它们弄错了吗?你在为他们创建面板吗?等等...正确设置您的项目很重要。基本上你给我们零信息来帮助你。

牢记这一切,这样的事情就可以正常工作(这被称为自包含代码示例,您应该始终提供您的问题,以便人们更容易帮助您)

import wx
a = wx.App(redirect=False)
f= wx.Frame(None,-1,"Some Frame",size = (200,200))
sz = wx.BoxSizer(wx.HORIZONTAL)
def OnClick(evt):
    print "Clicked:",evt.GetId()-10023
for i,img in enumerate(["img1","img2","img3"]):
    id = 10023+i
    p = wx.Panel(f,-1)
    sz.Add(p)
    sz1 = wx.BoxSizer()
    p.Bind(wx.EVT_LEFT_UP,OnClick)
    bmp = wx.Image(img).ConvertToBitmap()
    b = wx.StaticBitmap(p,-1,bmp)
    sz1.Add(b)
    p.SetSizer(sz1)

f.SetSizer(sz)
f.Layout()
f.Fit()
f.Show()
a.MainLoop()

请记住我没有测试它......但理论上它应该可以工作......

于 2013-04-04T19:33:02.693 回答