Как я могу поместить кадры внутри кадров, используя tkinter? - PullRequest
1 голос
/ 23 марта 2012

Я делаю программу для бейсбола, основанную на стратегических играх, созданных Авалоном Хиллсом в 70-х и 80-х, и последняя часть - графический интерфейс. Я сделал весь код для запуска командной строки игры, и у меня есть код для выбора составов с помощью графического интерфейса. Я представляю сетку 3by1 с табло в первом ряду, текстовое поле, отображающее результат, исход, хоум-бег, двойную игру и т. Д., А последний ряд разделен между картами кувшина и жидкого теста на левой стороне рамка кнопок. Кадр перевернется между атакующим и защитным кадром. Поэтому сначала в защитной раме предлагаются такие варианты, как изменение подачи, изменение положения и игра в мяч. Игровой мяч меняет фрейм на варианты нападения, которые включают в себя пинч-хит, пинч-бег, кражу и так далее. Но как я могу поместить кнопки в рамку, затем объединить карты игрока и кнопки в другую рамку, а затем добавить это в основную рамку?

Классы DFrame и OFrame являются внутренними классами (следовательно, "эльф", а не "я"). У меня есть динамическое переключение между 2 кадрами. Моя проблема - разрыв основного цикла DFrame, он воспроизводит только верхнюю часть первого, а self.roadOuts никогда не увеличивается. Вот что у меня есть:

while self.innings < 8.5 or self.homeScore == self.roadScore:
    self.roadOuts = 0
    while self.roadOuts < 3:
        self.dFrame.mainloop()

class DFrame(Frame):
    def __init__(elf, parent):
        Frame.__init__(elf)
        elf._playButton = Button(elf, text = 'Play Ball',
                                command = parent.oMenu)
        elf._playButton.grid(row = 0, column = 0)
        elf._pitchingButton = Button(elf, text = 'Pitching Change',
                                command = parent.pitchingChange)
        elf._pitchingButton.grid(row = 1, column = 0)
        elf._positionButton = Button(elf, text = 'Defensive Substitution',
                                command = parent.positionChange)
        elf._positionButton.grid(row = 0, column = 1)
        elf._alignButton = Button(elf, text = 'Change Positions',
                                command = parent.positionSwap)
        elf._alignButton.grid(row = 1, column = 1)
        elf._doubleButton = Button(elf, text = 'Double Switch',
                                command = parent.doubleSwitch)
        elf._doubleButton.grid(row = 2, column = 0)
        elf._walkButton = Button(elf, text = 'Intentional Walk',
                                command = parent.intentionalWalk)
        elf._walkButton.grid(row = 2, column = 1)
        elf._depthButton = Button(elf, text = 'Change Infield Depth',
                                command = parent.infieldDepth)
        elf._depthButton.grid(row = 3, column = 0)

class OFrame(Frame):
    def __init__(elf, parent):
        Frame.__init__(elf)
        elf._playButton = Button(elf, text = 'Play Ball',
                                command = parent.atBat)
        elf._playButton.grid(row = 0, column = 0)
        elf._pinchHitButton = Button(elf, text = 'Pinch Hit',
                                command = parent.pinchHit)
        elf._pinchHitButton.grid(row = 1, column = 0)
        elf._prfButton = Button(elf, text = 'Pinch Run First',
                                command = parent.pinchRunFirst)
        elf._prfButton.grid(row = 0, column = 1)
        elf._prsButton = Button(elf, text = 'Pinch Run Second',
                                command = parent.pinchRunSecond)
        elf._prsButton.grid(row = 1, column = 1)
        elf._prtButton = Button(elf, text = 'Pinch Run Third',
                                command = parent.pinchRunThird)
        elf._prtButton.grid(row = 2, column = 1)
        elf._stealButton = Button(elf, text = 'Steal',
                                command = parent.steal)
        elf._stealButton.grid(row = 2, column = 0)
        elf._bunt4HitButton = Button(elf, text = 'Bunt for a hit',
                                command = parent.bunt4AHit)
        elf._bunt4HitButton.grid(row = 3, column = 0)
        elf._hitNRunButton = Button(elf, text = 'Hit And Run',
                                command = parent.hitAndRun)
        elf._hitNRunButton.grid(row = 4, column = 0)
        elf._sacButton = Button(elf, text = 'Sacrifice',
                                command = parent.sacrifice)
        elf._sacButton.grid(row = 4, column = 1)
        elf._squeezeButton = Button(elf, text = 'Squeeze',
                                command = parent.squeeze)
        elf._squeezeButton.grid(row = 3, column = 1)

следующий метод вызывается при нажатии кнопки DFrame «play ball», и он создает OFrame.

def oMenu(self):
    self.dFrame.grid_forget()
    self.dFrame.destroy()
    self.oFrame = self.OFrame(self)
    self.oFrame.grid(row = 1, column = 1)
    self.oFrame.mainloop()

и в конце биты у меня есть:

self.oFrame.grid_forget()
self.oFrame.destroy()
self.dFrame = self.DFrame(self)
self.dFrame.grid(row = 1, column = 1)

1 Ответ

7 голосов
/ 23 марта 2012

Я не уверен, что понимаю ваш вопрос. Похоже, вы знаете, как поместить один кадр в другой (на самом деле это мало чем отличается от добавления кнопки в кадр - или любой другой виджет). Я думаю, что вы спрашиваете, как динамически переключаться, какой кадр отображается в любой момент времени.

Вы, вероятно, хотите метод grid_forget. использование кнопки play_ball должно привести к тому, что defense_frame вызовет свой метод grid_forget, в то же время изменив сетку offense_frame. Конечно, это будет pack_forget, если вы используете менеджер геометрии пакета.

EDIT

Добавлен очень простой рабочий пример макета сетки, который вы описали. Возможно, это можно сделать намного лучше, но это должно помочь вам начать. (В частности, функция switchOffenseDefense и кнопка switch_button).

import Tkinter as tk

base=tk.Tk()  #this is the main frame
root=tk.Frame(base)  #Really this is not necessary -- the other widgets could be attached to "base", but I've added it to demonstrate putting a frame in a frame.
root.grid(row=0,column=0)
scoreboard=tk.Frame(root)
scoreboard.grid(row=0,column=0,columnspan=2)

###
#Code to add stuff to scoreboard ...
# e.g. 
###
scorestuff=tk.Label(scoreboard,text="Here is the scoreboard")
scorestuff.grid(row=0,column=0)
#End scoreboard

#Start cards.
cards=tk.Frame(root)
cards.grid(row=1,column=0)
###
# Code to add pitcher and batter cards
###
clabel=tk.Label(cards,text="Stuff to add cards here")
clabel.grid(row=0,column=0)
#end cards

#Offense/Defense frames....
offense=tk.Frame(root)
offense.grid(row=1,column=1)
offense.isgridded=True #Dynamically add "isgridded" attribute.
offense_label=tk.Label(offense,text="Offense is coolest")
offense_label.grid(row=0,column=0)

defense=tk.Frame(root)
defense.isgridded=False
defense_label=tk.Label(defense,text="Defense is coolest")
defense_label.grid(row=0,column=0)

def switchOffenseDefense():
    print "Called"
    if(offense.isgridded):
        offense.isgridded=False
        offense.grid_forget()
        defense.isgridded=True
        defense.grid(row=1,column=1)
     else:
        defense.isgridded=False
        defense.grid_forget()
        offense.isgridded=True
        offense.grid(row=1,column=1)


switch_button=tk.Button(root,text="Switch",command=switchOffenseDefense)
switch_button.grid(row=2,column=1)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...