Python 如何使用tkinter将框架放入框架内?

Python 如何使用tkinter将框架放入框架内?,python,tkinter,Python,Tkinter,我正在制作一个基于70年代和80年代阿瓦隆·希尔斯(Avalon Hills)制作的战略游戏的棒球节目,最后一部分是gui。我已经编写了运行游戏命令行的所有代码,并且有了使用gui选择列表的代码。我设想一个3by1的网格,第一行有一个记分板,一个文本框显示结果、出局、本垒打、双打等,最后一行分为左侧的投手卡和击球手卡,以及一个按钮框。框架将在攻防框架之间翻转。因此,首先,防守框架提出了一些选择,比如改变投球、改变位置和打球。Play ball将帧更改为进攻选项,包括夹击、夹跑、抢断等。但是我如何

我正在制作一个基于70年代和80年代阿瓦隆·希尔斯(Avalon Hills)制作的战略游戏的棒球节目,最后一部分是gui。我已经编写了运行游戏命令行的所有代码,并且有了使用gui选择列表的代码。我设想一个3by1的网格,第一行有一个记分板,一个文本框显示结果、出局、本垒打、双打等,最后一行分为左侧的投手卡和击球手卡,以及一个按钮框。框架将在攻防框架之间翻转。因此,首先,防守框架提出了一些选择,比如改变投球、改变位置和打球。Play ball将帧更改为进攻选项,包括夹击、夹跑、抢断等。但是我如何将按钮放在一个框架内,然后将玩家卡和按钮组合到另一个框架中,然后将其添加到主框架中

DFrame&OFrame类是内部类(因此是“elf”,而不是“self”)。我有两帧之间的动态切换。我的问题是打破了DFrame主循环,它只播放第一个循环的顶部,而self.roadout从不增加。以下是我得到的:

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)
在击球结束时,我有:

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

我不确定我是否理解你的问题。似乎您知道如何将一个框架放到另一个框架中(这与向框架中添加按钮或任何其他小部件没有太大区别)。我认为您要问的是如何在任何给定时间动态切换显示的帧

您可能需要
grid\u忘记
方法。使用play_ball按钮应使防守框架调用其
grid_forget
方法,同时重新设置进攻框架的网格。当然,如果您使用的是pack geometry manager,这将是pack_forget

编辑

添加了您描述的网格布局的一个非常基本的工作示例。也许可以做得更好,但这应该让你开始。(特别是switchOffenseDefense功能和switch_按钮)


@所以只要初始化一个新的帧,把防御帧扔进去,用玩家卡把这个帧添加到一个帧中,然后把这个帧添加到主帧中?@mgilson:我已经得到了帧的切换。我现在的问题是局数。你可能知道,客队一直打到3局出局,然后主队一直打到3局出局,这将持续9局。我
self.oFrame.grid_forget()
self.oFrame.destroy()
self.dFrame = self.DFrame(self)
self.dFrame.grid(row = 1, column = 1)
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()