def makeOddsTab(self): if self.book.GetPageCount() == 5: self.book.DeletePage(4) oddpage, oddsizer = self.create_page('Odds') oddGrid = wx.FlexGridSizer(cols=1, vgap=5) weightLabel = wx.StaticText(oddpage, -1, "Symbol Weights") weightLabel.SetFont(self.hfont) oddsLabel = wx.StaticText(oddpage, -1, "Winning Combos") oddsLabel.SetFont(self.hfont) oddGrid.Add(weightLabel) text = wx.StaticText(oddpage, -1, cfg.WEIGHTS_TEXT) #text.Wrap(self.GetSize()[0] * .9) oddGrid.Add(text) self.nearMisses = [] self.nearMissOdds = [] cflag = wx.SizerFlags().Align(wx.ALIGN_CENTER_HORIZONTAL) #create top half self.weights = [] weightSizer = wx.GridSizer(cols=self.settings.numReels+2, rows=len(self.settings.visibleSymbols)) weightSizer.AddF(wx.StaticText(oddpage, -1, "Symbol"), cflag) for r in range(self.settings.numReels): text = "Reel %s" % (r + 1) weightSizer.AddF(wx.StaticText(oddpage, -1, text), cflag) weightSizer.AddF(wx.StaticText(oddpage, -1, "Blank Pad"), cflag) for s in self.settings.visibleSymbols: w = [] weightSizer.AddF(wx.StaticBitmap(oddpage, -1, makeBitmap(s, cfg.SLOT_SIZE)), cflag) for r in range(self.settings.numReels): ctrl = wx.SpinCtrl(oddpage, -1, min=0, initial=5, size=cfg.CTRL_SIZE) w.append(ctrl) weightSizer.AddF(ctrl, cflag) nmctrl = wx.SpinCtrl(oddpage, -1, min=0, initial=0, size=cfg.CTRL_SIZE) weightSizer.AddF(nmctrl, cflag) self.nearMisses.append(nmctrl) self.weights.append(w) oddGrid.Add(weightSizer) #oddsizer.Add(wx.Button(oddpage, -1, "Update Reels")) oddGrid.Add(oddsLabel) text = wx.StaticText(oddpage, -1, cfg.COMBOS_TEXT) #text.Wrap(self.nbW * .95) oddGrid.Add(text) #create bottom half self.odds = [] self.allCombos = [] self.payoffs = [] self.gfBox = wx.CheckBox(oddpage, -1, "Employ Gambler's Fallacy") oddGrid.Add(self.gfBox) self.overBox = wx.CheckBox(oddpage, -1, "Override True Reel Odds") oddGrid.Add(self.overBox) comboSizer = wx.GridSizer(rows=len(self.settings.payouts) + 1, cols=self.settings.numReels+4) comboSizer.Add(wx.StaticText(oddpage, -1, "Payout")) for r in range(self.settings.numReels): text = "Reel %s" % (r+1) comboSizer.Add(wx.StaticText(oddpage, -1, text)) comboSizer.AddF(wx.StaticText(oddpage, -1, "Odds (%)"), cflag) comboSizer.AddF(wx.StaticText(oddpage, -1, "Odds\n Override"), cflag) comboSizer.AddF(wx.StaticText(oddpage, -1, "Miss Override %"), cflag) self.overrides = [] for p in range(self.settings.numPayouts): o = [] pctrl = wx.SpinCtrl(oddpage, -1, min=0, initial=0, size=cfg.CTRL_SIZE) self.payoffs.append(pctrl) comboSizer.Add(pctrl) #make symbol combo boxes combos = [] for c in range(self.settings.numReels): combo = wx.combo.BitmapComboBox(oddpage, size=(45, -1)) symbols = self.settings.visibleSymbols for i in range (0, len(symbols)): combo.Append(symbols[i], makeBitmap(symbols[i], scale=cfg.SLOT_SIZE)) combo.Append(cfg.IM_EMPTY, makeBitmap(cfg.IM_EMPTY, scale=cfg.SLOT_SIZE)) combo.SetSelection(i) combos.append(combo) comboSizer.Add(combo) self.allCombos.append(combos) oddsText = wx.TextCtrl(oddpage, -1, "100", style=wx.TE_READONLY, size=cfg.CTRL_SIZE) override = wx.SpinCtrl(oddpage, -1, min=0, initial=0, size=cfg.CTRL_SIZE) comboSizer.Add(oddsText) comboSizer.Add(override) nmoctrl = wx.SpinCtrl(oddpage, -1, min=0, initial=0, size=cfg.CTRL_SIZE) comboSizer.Add(nmoctrl) self.nearMissOdds.append(nmoctrl) self.odds.append(oddsText) self.overrides.append(override) #SUMMARY INFORMATION summaryGrid = wx.BoxSizer(wx.HORIZONTAL) #odds totalOddsText = wx.StaticText(oddpage, -1, "Total Odds of a Win (%):") self.totalOdds = wx.TextCtrl(oddpage, -1, "100", style=wx.TE_READONLY, size=cfg.CTRL_SIZE) oddGrid.Add(comboSizer) summaryGrid.Add(totalOddsText) summaryGrid.Add(self.totalOdds) summaryGrid.Add(wx.StaticText(oddpage, -1, "Near Miss Odds:")) self.nmOdds = wx.TextCtrl(oddpage, -1, "0", style=wx.TE_READONLY, size=cfg.CTRL_SIZE) summaryGrid.Add(self.nmOdds) #max and min payouts summaryGrid.Add(wx.StaticText(oddpage, -1, "Max Payout:")) self.maxPay = wx.TextCtrl(oddpage, -1, "0", style=wx.TE_READONLY, size=cfg.CTRL_SIZE) summaryGrid.Add(self.maxPay) summaryGrid.Add(wx.StaticText(oddpage, -1, "Min Payout:")) self.minPay = wx.TextCtrl(oddpage, -1, "0", style=wx.TE_READONLY, size=cfg.CTRL_SIZE) summaryGrid.Add(self.minPay) oddGrid.AddF(wx.StaticLine(oddpage), self.eflag) oddGrid.Add(summaryGrid) oddsizer.Add(oddGrid) self.Bind(wx.EVT_COMBOBOX, self.onComboSelect) self.Bind(wx.EVT_CHECKBOX, self.onSpin) self.Bind(wx.EVT_SPINCTRL, self.onSpin) oddpage.SetSizerAndFit(oddsizer) self.SetOdds() self.makeReels() oddpage.SetupScrolling() oddpage.Refresh() oddpage.Update()
def __init__(self, parent, settings="", subject="", *args, **kwargs): # create the parent class wx.Frame.__init__(self, parent, *args, **kwargs) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) #self.SetSize((800, 600)) #bmp = wx.Bitmap('images/background.png') #self.background = wx.StaticBitmap(self, -1, bmp, (0,0)) #initialize the game settings if settings: self.settings = settings else: dlg = wx.FileDialog(self, "Choose a settings file", os.path.join(os.getcwd(), "settings"), "", "*.set", wx.OPEN) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() f = open(path, "r") self.settings = pickle.load(f) f.close() dlg.Destroy() if subject: self.subject = subject else: d = self.settings.subInfo getinfo = False for k in d.keys(): if d[k] == True: getinfo = True if getinfo: infodialog = subjectinfo.SubjectInfoDialog(self, "Subject Info") infodialog.enable_control("Name", d["Name"]) infodialog.enable_control("Age", d["Age"]) infodialog.enable_control("Sex", d["Sex"]) infodialog.enable_control("Handedness", d["Handedness"]) ans2 = infodialog.ShowModal() if ans2 == wx.ID_SAVE: #infodialog.save_info() infodialog.save_info() infodialog.cogsub.expname = self.settings.saveAs infodialog.cogsub.session = self.settings.session self.subject = infodialog.cogsub else: self.subject= Subject() self.subject.expname = self.settings.saveAs self.subject.session = self.settings.session fname = "%s_%s_%s_%s" % (self.subject.expname, self.subject.s_id, self.subject.session, self.subject.date) dlg = wx.FileDialog(self, "Choose a location to save subject data file", os.getcwd(), fname, "*.csv", wx.SAVE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.subject.fpath = path dlg.Destroy() #create a Slots object self.slots = self.settings.slots self.round = 1 self.balance = self.settings.seed # the pretty background - not working properly yet self.SetOwnBackgroundColour(cfg.STEEL_BLUE) #print self.settings.combos # get the user params from the database self.get_user_params() # create the sizer that everything fits into self.sizer = wx.FlexGridSizer(4, 1, 5, 5) # populate the payout sizer with values from the database if self.settings.showPayouts: self.payoutpanel = commongui.PayoutTable(self, self.settings, cfg.LIGHT_GREY) else: self.payoutpanel = wx.Panel(self, wx.ID_ANY) #self.payoutpanel.Bind(wx.EVT_PAINT, self.on_paint) self.payoutpanel.SetBackgroundColour(cfg.STEEL_BLUE) self.payoutpanel.SetForegroundColour(cfg.LIGHT_GREY) self.payoutpanel.SetWindowStyle(wx.RAISED_BORDER) # create the first row centeredflag = wx.SizerFlags(1).Align(wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER) self.sizer.AddF(self.payoutpanel, centeredflag) # create the text boxes wagersizer, self.wagertext = self.create_labeled_num_box("Wager") self.wagertext.SetValue(str(self.settings.betsizes[0])) winsizer, self.wintext = self.create_labeled_num_box("Win") balancesizer, self.balancetext = self.create_labeled_num_box("Balance", str(self.balance)) bottomflag = wx.SizerFlags(1).Align(wx.ALIGN_BOTTOM|wx.ALIGN_CENTER).Border(wx.ALL, 5) #sizer for the info (wager size, balance, win) infosizer = wx.BoxSizer(wx.HORIZONTAL) infosizer.AddF(wagersizer, bottomflag) infosizer.AddF(winsizer, bottomflag) infosizer.AddF(balancesizer, bottomflag) # the buttons will have to go in a separate sub-sizer buttonsizer = wx.BoxSizer(wx.HORIZONTAL) self.increasebtn = wx.BitmapButton(self, wx.ID_ANY, commongui.makeBitmap(cfg.IM_INCREASEWAGER), style = wx.NO_BORDER) self.decreasebtn = wx.BitmapButton(self, wx.ID_ANY, commongui.makeBitmap(cfg.IM_DECREASEWAGER), style = wx.NO_BORDER) self.spinbtn = wx.BitmapButton(self, wx.ID_ANY, commongui.makeBitmap(cfg.IM_SPIN), style = wx.NO_BORDER) self.spinbtn.SetBitmapDisabled(commongui.makeBitmap(cfg.IM_SPIN_DEAC)) self.increasebtn.SetBitmapDisabled(commongui.makeBitmap(cfg.IM_INCREASEWAGER_DEAC)) self.decreasebtn.SetBitmapDisabled(commongui.makeBitmap(cfg.IM_DECREASEWAGER_DEAC)) buttonsizer.AddF(self.decreasebtn, bottomflag) buttonsizer.AddF(self.spinbtn, bottomflag) buttonsizer.AddF(self.increasebtn, bottomflag) #spinning reel self.create_spinning_wheel(self.sizer) #buttons and info self.sizer.AddF(infosizer, bottomflag) self.sizer.AddF(buttonsizer, bottomflag) self.sizer.AddStretchSpacer() # create an outer sizer to have a nice border outersizer = wx.BoxSizer(wx.VERTICAL) outersizer.AddF(self.sizer, wx.SizerFlags(1).Expand().Align( wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER).Border(wx.ALL, 20)); self.SetSizerAndFit(outersizer) # bindings self.decreasebtn.Bind(wx.EVT_BUTTON, lambda event, name='decrease':self.OnChangeWager(event, name)) self.increasebtn.Bind(wx.EVT_BUTTON, lambda event, name='increase':self.OnChangeWager(event, name)) self.Bind(wx.EVT_BUTTON, self.OnSpin, self.spinbtn) # these bindings are for the not-quite-functional background self.Bind(wx.EVT_SIZE, self.OnSize) f = open('introtext.html', 'w') f.write(self.settings.instructions) f.close() # create the initial instructions dialog dialog = commongui.InfoDialog(self, "Welcome to CogSlots", 'introtext.html') if (dialog.ShowModal() == wx.ID_CANCEL): sys.exit(0) #if gamblersFallacy, need to purge near misses from the combos list if self.settings.gamblersFallacy: newComs = [] for c in self.settings.combos: if cfg.IM_BLANK not in c: newComs.append(c) self.settings.combos = newComs # show thyself self.Centre() self.Show(True) self.Refresh() self.Update() #starting vars to monitor subject activity self.startTime = time.clock() self.wagerIncreases = 0 self.wagerDecreases = 0
def __init__(self, parent, *args, **kwargs): # create the parent class wx.Frame.__init__(self, parent, *args, **kwargs) #self.FRAME_SIZE = (750, 600) self.settings = Settings() # the notebook #nbW = self.FRAME_SIZE[0] #nbH = self.FRAME_SIZE[1] * 0.9 #self.nbH = nbH #self.nbW = nbW self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) self.book = wx.Notebook(self, wx.ID_ANY) betspage, betssizer = self.create_page('Bets') self.betspage = betspage self.betssizer = betssizer symbolpage, symbolsizer = self.create_page('Symbols') #self.oddpage, self.oddsizer = self.create_page('Odds') infopage, infosizer = self.create_page('Info') instructionPage, instructionSizer = self.create_page('Instructions') self.infopage = infopage self.iCtrl = wx.TextCtrl(instructionPage, -1, self.settings.instructions, style = wx.TE_MULTILINE) flagsExpand = wx.SizerFlags(1) flagsExpand.Expand() instructionSizer.AddF(self.iCtrl, flagsExpand) # same font for all the headers self.hfont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) self.hfont.SetWeight(wx.FONTWEIGHT_BOLD) self.hfont.SetPointSize(self.hfont.GetPointSize()*1.3) # and the same border flag/label flag self.bflag = wx.SizerFlags().Border(wx.ALL, 5) self.eflag = self.bflag.Expand() self.hflag = wx.SizerFlags().Border(wx.LEFT, 10) #******************************************* # The bets page #******************************************* # Number of rounds self.roundsentry = wx.TextCtrl(betspage, wx.ID_ANY, style=wx.TE_RIGHT) self.seedentry = wx.TextCtrl(betspage, wx.ID_ANY, style=wx.TE_RIGHT) self.debtallowed = wx.CheckBox(betspage, wx.ID_ANY, "Allow subject debt") # Wagers self.wagernum = wx.Choice(betspage, wx.ID_ANY, choices=["New"]) self.amountentry = wx.TextCtrl(betspage, wx.ID_ANY, style=wx.TE_RIGHT) self.addbtn = wx.Button(betspage, wx.ID_ANY, "Add") self.wagertable = wx.StaticBoxSizer(wx.StaticBox(betspage), wx.VERTICAL) self.wagerrows = [] # number of rounds stuff roundslabel = wx.StaticText(betspage, wx.ID_ANY, "Number of Rounds:") roundslabel.SetFont(self.hfont) betssizer.AddF(roundslabel, self.hflag) numroundsbox = wx.BoxSizer(wx.HORIZONTAL) numroundsbox.AddF(self.roundsentry, self.bflag) debtlabel = wx.StaticText(betspage, wx.ID_ANY, "Subject Debt:") debtlabel.SetFont(self.hfont) betssizer.AddF(numroundsbox, self.bflag) #numroundsbox.AddF(debtlabel, self.bflag) #numroundsbox.AddF(self.debtallowed, self.bflag) betssizer.AddF(debtlabel, self.bflag) betssizer.AddF(self.debtallowed, self.bflag) betssizer.AddF(wx.StaticLine(betspage), self.eflag) # the currency stuff currencylabel = wx.StaticText(betspage, wx.ID_ANY, "Currency:") currencylabel.SetFont(self.hfont) betssizer.AddF(currencylabel, self.hflag) self.currencytype = wx.Choice(betspage, wx.ID_ANY, choices=["Credits", "$"]) currencybox = wx.BoxSizer(wx.HORIZONTAL) currencybox.AddF(wx.StaticText(betspage, wx.ID_ANY, "Seed Amount:"), self.bflag) currencybox.AddF(self.seedentry, self.bflag) currencybox.AddF(self.currencytype, self.bflag) betssizer.AddF(currencybox, self.bflag) betssizer.AddF(wx.StaticLine(betspage), self.eflag) # the wager stuff wagerlabel = wx.StaticText(betspage, wx.ID_ANY, "Wagers:") wagerlabel.SetFont(self.hfont) betssizer.AddF(wagerlabel, self.hflag) wagerbox = wx.BoxSizer(wx.HORIZONTAL) wagerbox.AddF(self.wagernum, self.bflag) wagerbox.AddF(wx.StaticText(betspage, wx.ID_ANY, "Amount:"), self.bflag) wagerbox.AddF(self.amountentry, self.bflag) wagerbox.AddF(self.addbtn, self.bflag) betssizer.AddF(wagerbox, self.bflag) betssizer.AddF(self.wagertable, self.eflag) # Bindings, woot self.Bind(wx.EVT_BUTTON, self.OnAddWager, self.addbtn) self.Bind(wx.EVT_CHOICE, self.OnChooseWager, self.wagernum) self.SetBets() #******************************************* # The Symbols page #******************************************* # Visible types of symbols choices = [] for i in range(1,11): choices.append(str(i)) pbox = wx.BoxSizer(wx.HORIZONTAL) pbox.AddF(wx.StaticText(symbolpage, wx.ID_ANY, "Number of Winning Combinations:"), self.bflag) self.pCtrl = wx.Choice(symbolpage, wx.ID_ANY, choices=choices) pbox.AddF(self.pCtrl, self.bflag) symbolsizer.AddF(pbox, self.bflag) rbox = wx.BoxSizer(wx.HORIZONTAL) rbox.AddF(wx.StaticText(symbolpage, wx.ID_ANY, "Number of Reels:"), self.bflag) self.rCtrl = wx.Choice(symbolpage, wx.ID_ANY, choices=choices) rbox.AddF(self.rCtrl, self.bflag) symbolsizer.AddF(rbox, self.bflag) symbolsizer.AddF(wx.StaticLine(symbolpage), self.eflag) symbolslabel = wx.StaticText(symbolpage, wx.ID_ANY, "Select Symbols:") symbolslabel.SetFont(self.hfont) symbolsizer.AddF(symbolslabel, self.hflag) symsizer = wx.BoxSizer(wx.HORIZONTAL) self.symboxes = [] for s in self.settings.symbols: if s != cfg.IM_EMPTY: checkbox = wx.CheckBox(symbolpage, wx.ID_ANY, "") #checkbox.SetValue(True) checkbox.cbname = s self.symboxes.append(checkbox) checkSizer = wx.BoxSizer(wx.VERTICAL) checkSizer.Add(wx.StaticBitmap(symbolpage, -1, makeBitmap(s, [16, 16])), 1) checkSizer.Add(checkbox, 1) symsizer.AddF(checkSizer, self.bflag) symbolsizer.AddF(symsizer, self.bflag) self.SetSymbols() symbolpage.SetSizerAndFit(symbolsizer) #******************************************* # The Info page #******************************************* # Payout table self.payoutframe = commongui.PayoutTable(infopage, self.settings) self.payoutSizer = wx.BoxSizer(wx.VERTICAL) self.payoutSizer.Add(self.payoutframe) infosizer.Add(self.payoutSizer) # subject info self.collectname = wx.CheckBox(infopage, wx.ID_ANY, "Name") self.collectage = wx.CheckBox(infopage, wx.ID_ANY, "Age") self.collectsex = wx.CheckBox(infopage, wx.ID_ANY, "Sex") self.collecthandedness = wx.CheckBox(infopage, wx.ID_ANY, "Handedness") self.showpayouts = wx.CheckBox(infopage, wx.ID_ANY, "Show Payouts Table During Gameplay?") # subjective probability estimate self.getprobestimate = wx.CheckBox(infopage, wx.ID_ANY, "Obtain Subject Probability Estimate") self.getprobestimate.SetFont(self.hfont) self.estimatetiming = wx.Choice(infopage, wx.ID_ANY, choices=["beginning", "end"]) self.estimateinterval = wx.TextCtrl(infopage, wx.ID_ANY, style=wx.TE_RIGHT) # save as self.filenamebox = wx.TextCtrl(infopage, wx.ID_ANY) self.sessionnumbox = wx.TextCtrl(infopage, wx.ID_ANY, style=wx.TE_RIGHT) # info collection package infolabel = wx.StaticText(infopage, wx.ID_ANY, "Collect Subject Information") infolabel.SetFont(self.hfont) infosizer.AddF(infolabel, self.hflag) infosizer.AddF(self.collectname, self.bflag) infosizer.AddF(self.collectage, self.bflag) infosizer.AddF(self.collectsex, self.bflag) infosizer.AddF(self.collecthandedness, self.bflag) infosizer.AddF(wx.StaticLine(self), self.eflag) infosizer.AddF(self.showpayouts, self.eflag) infosizer.AddF(wx.StaticLine(self), self.eflag) # probability estimate stuff infosizer.AddF(self.getprobestimate, self.hflag) self.pBox = wx.BoxSizer(wx.VERTICAL) self.probrow = wx.BoxSizer(wx.HORIZONTAL) self.probrow.AddF(self.estimatetiming, self.bflag) self.probrow.AddF(wx.StaticText(infopage, wx.ID_ANY, "of every"), self.bflag) self.probrow.AddF(self.estimateinterval, self.bflag) self.probrow.AddF(wx.StaticText(infopage, wx.ID_ANY, "rounds"), self.bflag) self.pBox.AddF(self.probrow, self.bflag) self.mrow = wx.BoxSizer(wx.HORIZONTAL) self.mrow.AddF(wx.StaticText(infopage, wx.ID_ANY, "Message:"), self.bflag) self.probText = wx.TextCtrl(infopage, wx.ID_ANY, "") self.mrow.AddF(self.probText, self.bflag) self.pBox.AddF(self.mrow, self.bflag) infosizer.AddF(self.pBox, self.eflag) infosizer.AddF(wx.StaticLine(infopage), self.eflag) # Save as saveaslabel = wx.StaticText(infopage, wx.ID_ANY, "Save As:") saveaslabel.SetFont(self.hfont) infosizer.AddF(saveaslabel, self.hflag) savegrid = wx.FlexGridSizer(2,2) savegrid.AddF(wx.StaticText(infopage, wx.ID_ANY, "Filename:"), self.bflag) savegrid.AddF(self.filenamebox, self.eflag) savegrid.AddF(wx.StaticText(infopage, wx.ID_ANY, "Session Number:"), self.bflag) savegrid.AddF(self.sessionnumbox, self.eflag) infosizer.AddF(savegrid, self.eflag) infopage.SetSizerAndFit(infosizer) self.SetInfo() #******************************************* # The Odds page #******************************************* self.makeOddsTab() #******************************************* # Common Elements #******************************************* # Buttons buttonsizer = wx.BoxSizer(wx.HORIZONTAL) updatebtn = wx.Button(self, wx.ID_ANY, 'Update') resetbtn = wx.Button(self, wx.ID_ANY, 'Reset') loadbtn = wx.Button(self, wx.ID_OPEN) savebtn = wx.Button(self, wx.ID_SAVE) #cancelbtn = wx.Button(self, wx.ID_CANCEL) okaybtn = wx.Button(self, wx.ID_OK) buttonsizer.AddF(updatebtn, self.bflag) buttonsizer.AddF(resetbtn, self.bflag) buttonsizer.AddF(loadbtn, self.bflag) buttonsizer.AddF(savebtn, self.bflag) #buttonsizer.AddF(cancelbtn, self.bflag) buttonsizer.AddF(okaybtn, self.bflag) # button bindings self.Bind(wx.EVT_BUTTON, self.OnLoad, loadbtn) self.Bind(wx.EVT_BUTTON, self.OnSave, savebtn) self.Bind(wx.EVT_BUTTON, self.OnOkay, okaybtn) self.Bind(wx.EVT_BUTTON, self.OnUpdate, updatebtn) self.Bind(wx.EVT_BUTTON, self.OnReset, resetbtn) # the outer sizer to pack everything into bottomflag = wx.SizerFlags().Align(wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM).Border(wx.ALL, 10).Expand() outersizer = wx.FlexGridSizer(3, 1) middleSizer = wx.BoxSizer(wx.HORIZONTAL) middleSizer.AddF(self.book, wx.SizerFlags(1).Expand()) #midSize = (self.FRAME_SIZE[0] * 0.9, self.FRAME_SIZE[1] * 0.9) #middleSizer.SetMinSize(midSize) outersizer.AddF(middleSizer, bottomflag) outersizer.AddF(buttonsizer, bottomflag) self.SetSizerAndFit(outersizer) #self.SetSize(self.FRAME_SIZE) self.Show(True)