【问题标题】:Layout Problems with TkinterTkinter 的布局问题
【发布时间】:2023-03-30 10:04:01
【问题描述】:

我对 tkinter 中的布局有疑问。这是 Layout我想要,这就是I have right now. 我不明白为什么会这样。我想当我为特定框架指定宽度和高度时,它会占用所有这些位置,但在查看self.GameStatFrame 时并没有发生这种情况。如果有人能向我解释为什么代码会这样做以及我的错误是什么,那就太好了。

代码如下:

class Application(tk.Frame):
    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, parent)
        #self.update_idletasks()
        self.createWidgets()

    def createWidgets(self):

        #new frame for everything not in the canvas
        #self.Frame = tk.Frame(self.parent)
         self.MlGameStatFrame = tk.Frame(self.parent, width=600, height=300, 
         bg='blue')
         self.GameStatFrame = tk.Frame(self.MlGameStatFrame, bg='white', 
         width=300, height=300)
         self.MlFrame = tk.Frame(self.MlGameStatFrame,  bg='white', 
         width=300, height=300)


        #self.Frame.pack()
        self.createGraphWidget()
        self.MlGameStatFrame.pack()
        self.GameStatFrame.pack(side=tk.LEFT, anchor=tk.W, fill=tk.BOTH)
        self.MlFrame.pack(side=tk.BOTTOM, fill=tk.BOTH)

        self.createGameStats(self.GameStatFrame)
        self.createMlStats(self.MlFrame)
        #self.createLog()


    def createGraphWidget(self):
        self.graph = tk.Canvas(self.parent, background ='white',             
        width=200,height=300)
        self.graph.create_rectangle(0,20,40,50)

        self.graph.pack(side=tk.TOP,fill=tk.X)
# needs to get a frame because side by side with Ml stats
    def createGameStats(self,GameFrame):

        Frame1 = tk.Frame(GameFrame, bg='red', width=300)
        tk.Label(Frame1, text="Status: ").pack(side=tk.LEFT, expand=tk.YES) 
        #initialize with certain value for now
        self.statusChange = tk.Label(Frame1, 
        text="Learning").pack(side=tk.LEFT, expand=tk.YES)

        Frame2=tk.Frame(GameFrame, bg='green')

        tk.Label(Frame2, text="Fitness").pack(side=tk.LEFT, expand=tk.YES, 
        anchor=tk.W)    #could get changed
        self.fitnessChange = tk.Label(Frame2, text="6").pack(side=tk.LEFT, 
        expand=tk.YES)

        Frame1.pack(side=tk.TOP, anchor=tk.W)
        Frame2.pack(side=tk.TOP,fill=tk.X, anchor=tk.W)


    def createMlStats(self, MlFrame):
        Frame1 = tk.Frame(MlFrame)
        tk.Label(Frame1, text="Status: ").pack(side=tk.LEFT, expand=tk.YES)  
    # initialize with certain value for now
        self.statusChange = tk.Label(Frame1,     
        text="Learning").pack(side=tk.LEFT, fill=tk.X, expand=tk.YES)

        Frame2=tk.Frame(MlFrame)
        tk.Label(Frame2, text="Fitness").pack(expand=tk.YES, anchor=tk.W) 
        self.fitnessChange = tk.Label(Frame2, text="6").pack(side=tk.LEFT, 
        fill=tk.X, expand=tk.YES)

        Frame1.pack(side=tk.TOP, fill=tk.BOTH,anchor=tk.W)
        Frame2.pack(side=tk.TOP,fill=tk.BOTH)

def main():
    root = tk.Tk()

    root.geometry('600x900-0+0') #120* 50 ppixels in top right corner of desktop
    app = Application(root)

    app.master.title('Sample application')

    app.mainloop()

if __name__ == '__main__':
    main()

【问题讨论】:

  • 您的代码中的缩进不正确。

标签: python layout tkinter


【解决方案1】:

.grid 布局管理器更加灵活:

class Application(Frame):
    def __init__(self, parent):
       self.parent = parent
       Frame.__init__(self, parent)
       self.create_widgets()

    def create_widgets(self):
        graph = Canvas(self.parent, width=200, height=300, bg="white")
        graph.create_rectangle(0, 20, 40, 50)

        mlgamestat_frame = Frame(self.parent, width=600, height=300, bg="blue")
        gamestat_frame = Frame(mlgamestat_frame, width=300, height=300, bg="yellow")
        ml_frame = Frame(mlgamestat_frame, width=300, height=300, bg="green")

        graph.grid(row=0, column=0)
        mlgamestat_frame.grid(row=1, column=0)
        gamestat_frame.grid(row=0, column=0)
        ml_frame.grid(row=0, column=1)

您可以像在表格中一样放置小部件。上面的代码使您的预期布局。

【讨论】:

  • 我不会更灵活地调用grid,只是以不同的方式灵活。它适合在网格中布局,而pack 最适合从左到右和从上到下的布局。您还犯了人们使用 grid 时常犯的一个错误,即您忽略了为一行或多行和一列或多列分配非零权重。
  • 为什么需要为权重分配一个非零值?是否使行或列可伸缩以调整大小?
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 2013-03-24
  • 2022-01-19
  • 2017-01-10
  • 2011-09-08
  • 2014-03-24
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多