0

嗯,我是 wx 的菜鸟,我 5 天前开始学习它。我正在尝试使用诸如位图按钮之类的卡片制作像记忆一样的游戏,但事件不想绑定在我的卡片上。我在网上搜索了一些人寻求帮助,但他们不知道为什么。我将程序发送给一位在 Linux Fedora 中工作的人,他说它可以工作……问题出在 MyDialog 类中,功能卡。我制作了一个类似于这个的测试程序,并将事件绑定在 for 命令中,它可以正常工作。抱歉,如果这个网站上的某个地方存在答案,我找不到它......

import random
import wx
global n
global ControlVar
ControlVar = False


class MyDialog(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, size=(200, 150))
        wx.StaticBox(self, -1, 'Card pairs', (5, 5), size=(180, 70))
        wx.StaticText(self, -1, 'Number:    ', (15, 40))

        self.spin = wx.SpinCtrl(self, -1, '1', (65, 40), (60, -1), min=3, max=5)
        self.spin.SetValue(4)
        wx.Button(self, 2, 'Ok', (70, 85), (60, -1))
        self.Bind(wx.EVT_BUTTON, self.OnClose, id=2)
        self.Centre()
        self.ShowModal()
        self.Destroy()

    def OnClose(self, event):
        pair = self.spin.GetValue()
        self.Close()
        return(pair)


class MyMenu(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(1000, 700))
        self.SetMinSize(wx.Size(400, 300))
        self.panel = wx.Panel(self, wx.ID_ANY)
        self.SetIcon(wx.Icon('computer.png', wx.BITMAP_TYPE_ANY))


        bmp = wx.Image('wood.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0))

        menubar = wx.MenuBar()
        file = wx.Menu()
        edit = wx.Menu()

        file.Append(101, '&New Game', 'Start a New Game')
        file.AppendSeparator()
        file.Append(105,'&Quit\tEsc', 'Quit the Application')          

        menubar.Append(file, '&File')
        self.SetMenuBar(menubar)
        self.statusbar = self.CreateStatusBar()
        self.Centre()

        self.Bind(wx.EVT_MENU, self.OnNew, id=101)
        self.Bind(wx.EVT_MENU, self.OnQuit, id=105)
        self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKey)

    def OnNew(self, event):
        if ControlVar:
            for i in range(n*2):
                self.dugmad[i].Destroy()
        md = MyDialog(None, -1, 'New Game')
        n = md.OnClose(None)
        self.statusbar.SetStatusText('You Selected {} Pairs.'.format(n))
        self.Cards()

    def OnButton(self, event):
        print('ANYTHING PLEASE!')

## problem ahead!
    def Cards(self):
        image = wx.Image('cveteki.jpg', wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.dugmad = []
        for i in range(2*n):
            dugme = wx.BitmapButton(self, i, image)
            self.dugmad.append(dugme)
            self.Bind(wx.EVT_BUTTON, self.OnButton, id=i)

        if n == 3:
            self.Draw(2, 3)
        if n == 4:
            self.Draw(2, 4)
        if n == 5:
            self.Draw(2, 5)

    def Draw(self,a, b):            
        gs = wx.GridSizer(a,b,40,40)
        for i in range(n*2):
            gs.Add(self.dugmad[i],0, wx.EXPAND)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(gs, 1, wx.EXPAND | wx.ALL, 40)
        self.SetSizer(vbox)
        self.Layout()
        self.Refresh()
        global ControlVar
        ControlVar=True


    def OnKey(self, event):
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_ESCAPE:
             box = wx.MessageDialog(None, 'Are you sure you want to quit?', 'Quit', wx.YES_NO | wx.ICON_QUESTION)
             if box.ShowModal() == wx.ID_YES:
                self.Close()

    def OnQuit(self, event):
        box = wx.MessageDialog(None, 'Are you sure you want to quit?', 'Quit', wx.YES_NO | wx.ICON_QUESTION)
        if box.ShowModal() == wx.ID_YES:
            self.Destroy()


class MyApp(wx.App):
    def OnInit(self):
        frame = MyMenu(None, -1, 'Memory')
        frame.Show(True)
        return (True)

def main():
    app = MyApp(False)
    app.MainLoop()
main()
4

2 回答 2

0

我试图运行您的代码,但我没有准备好具有这些名称的图像,而且我无法理解您的所有全局变量,并且我收到关于 n 未定义的错误。因此,我为您做了一个简单的测试,希望对您有所帮助:

import wx
app = wx.App()

def onButton(evt):
    print "button pressed!", evt.GetEventObject().GetLabel()

frm = wx.Frame(None)

for i in range(10):
    but = wx.Button(frm, pos=(10, i*20), label="button %s" % i)
    but.Bind(wx.EVT_BUTTON, onButton)

frm.Show()
app.MainLoop()

如果你真的想要,but.Bind(...) 也可以是 frm.Bind(...)。请注意,我不喜欢 id 的:我不在乎什么 id 的 wxPython 分配了按钮。

我不确定您的代码有什么问题,因为我无法运行它并且不想用它调试其他错误。

再次,我希望这会有所帮助。

于 2013-01-11T03:56:43.087 回答
0

但是为什么你在创建 MyDialog 之后就销毁它?检查:在 self.ShowModal() 之后立即调用 self.Destroy() 方法。

于 2013-01-12T05:39:04.437 回答