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を気にしないことに注意してください。wxPythonがボタンに割り当てたIDを気にする必要はありません。

コードを実行できず、他のエラーをデバッグしたくなかったため、コードの何が問題になっているのかわかりません。

繰り返しますが、これがお役に立てば幸いです。

于 2013-01-11T03:56:43.087 に答える
0

しかし、作成した直後に MyDialog を破棄するのはなぜですか? チェック: self.ShowModal() の直後に self.Destroy() メソッド呼び出しがあります。

于 2013-01-12T05:39:04.437 に答える