簡體   English   中英

為什么我的 tkinter 框架沒有填滿整個窗口

[英]Why doesn't my tkinter frame fill the entire window

我正在嘗試創建一個問答游戲,但無法將標簽放在正確的位置,我希望“數學類別”位於左上角,但是當我選擇第 0 行和第 0 列時,它會將其放在中間? 幫助................................................. ………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………………………………

import tkinter
import tkinter as tk
from tkinter.ttk import *
from tkinter import *




score = 0
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(MainMenu)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()


class MainMenu(tk.Frame):
    def __init__(self, master):
        #Maths Picture/Button
        global photo
        tk.Frame.__init__(self, master)
        #configure = tk.Frame(self)
        #configure.grid_rowconfigure(0, weight=1)
        #configure.grid_columnconfigure(0, weight=1)
        photo = PhotoImage(file = "MathsPicture.png")
        photoimage = photo.subsample(3,3)
        lbl = tk.Label(self, text="MainMenu", font=('Verdana', 40, "bold"))
        lbl.grid(row=0, column=1)
        button = tk.Button(self, image = photo, command=lambda:[master.switch_frame(PageOne), ScoreUpdate()])
        button.grid(row=1, column=1)
        #tk.Button(self, text="Go to page two",command=lambda:[master.switch_frame(PageTwo), ScoreUpdate()]).pack()
        
def ScoreUpdate(event=None):
    global score
    score += 500

class PageOne(tk.Frame):
    global score
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        #tk.Frame.configure
        tk.Frame.grid_propagate(self)
        lbl = tk.Label(self, text="Maths Category", font=("Verdana", 20))
        lbl.grid(row=0, column = 0)
        lbl = tk.Label(self, text=score , font=("Verdana", 40, "bold"))
        lbl.grid(row=1, column=0)
        lbl = tk.Label(self, text="Question 1", font=('Helvetica', 18, "bold"))
        lbl.grid(row=1, column=3)
        btn = tk.Button(self, text="Go back to MainMenu", font=('Helvetica', 20), command=lambda: master.switch_frame(MainMenu))
        btn.grid(row=0, column=4)
        btn = tk.Button(self, text='Update score', command=ScoreUpdate)
        btn.grid(row=3, column=4)
        btn = tk.Button(self, text="Go to page two",command=lambda:[master.switch_frame(PageTwo), ScoreUpdate()])
        btn.grid(row=4,column=3)
        print("Physics Question 1")

class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        tk.Label(self, text="Question 2", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, text="Go back to start page",command=lambda: master.switch_frame(PageThree)).pack()
        tk.Button(self, text='Update score', command=ScoreUpdate)
        print("Physics Question 2")

class PageThree(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        tk.Label(self, text="Question 3", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, text="Go back to start page",command=lambda: master.switch_frame(MainMenu)).pack()
        tk.Button(self, text='Update score', command=ScoreUpdate)
        print("Physics Question 3")



if __name__ == "__main__":
    window = SampleApp()
    window.geometry("1200x900")

    window.mainloop()

在此處輸入圖片說明

lbl.grid(row=0, column=0)該將lbl.grid(row=0, column=0)放在左上角。 在我看來, PageOne對象好像位於窗口的中心。

嘗試給PageOne一個背景顏色,看看它有多大以及它的位置。 我的猜測是包含小部件在窗口中居中,或者包含框架(或窗口)配置為展開(使用columnconfigure )。

更新

PageOne被打包到根窗口 ( SampleApp ) 中,默認情況下, pack會將其放置在頂部中間。 您可以通過指定所需位置來更改此設置。

def switch_frame(self, frame_class):
    new_frame = frame_class(self)
    if self._frame is not None:
        self._frame.destroy()
    self._frame = new_frame
    self._frame.pack(expand=True, anchor='nw')  # New pack details

通過將分配給小部件的空間設置為expand ,它將嘗試獲得盡可能多的空間,然后我將小部件放置在右上角的anchor='nw' (如在西北)。

但這會將所有幀放在左上角。 如果您只想在PageOne小部件中使用此功能,您可以在那里調整包裝詳細信息。

class PageOne(tk.Frame):
    global score
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        self.pack(expand=True, anchor='nw') # New pack details
        # etc, etc.

默認情況下,小部件在分配給它的空間中居中。 如果您希望小部件粘在空間的頂部而不是中間,請使用sticky屬性。

例如,以下將強制標簽位於分配給它的單元格的左上(西北)角。

lbl.grid(row=0, column = 0, sticky="nw")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM