Python Tkinter изменение цвета фона рамки вроде бы не имеет никакого эффекта - PullRequest
0 голосов
/ 19 января 2020

Я довольно новичок в Tkinter и пытаюсь поместить кадр в кадр, что я успешно сделал, но когда я пытаюсь изменить цвет фона родительского кадра, это не имеет никакого эффекта.

Мой код выглядит следующим образом:

import tkinter as tk

class card_game_gui:

    def __init__(self, root):
        self.pagenum = 1
        self.root = root

    def page1(self):
        page = tk.Frame(self.root, bg="blue") #<-- this line has seemingly no effect
        form = tk.Frame(page, bg="white")
        self.root.grid_columnconfigure(0, weight=1)

        tk.Label(self.root, text='Add player', bg="dark gray").grid(row=0, column=0, columnspan=2, sticky="NESW")

        self.user = tk.Entry(form, bd=0, bg="light gray")
        self. user.bind("<FocusIn>", self.UserEntryFocusIn)
        self.user.bind("<FocusOut>", self.UserEntryFocusOut)
        self.user.grid(row=1, column=1, sticky="NSEW", pady=5)

        user_label = tk.Label(form, text="USERNAME:", bg="white")
        user_label.grid(row=1, column=0, sticky="NSEW")

        self.pw = tk.Entry(form, bd=0, bg="light gray", show="*")
        self.pw.bind("<FocusIn>", self.PwEntryFocusIn)
        self.pw.bind("<FocusOut>", self.PwEntryFocusOut)
        self.pw.grid(row=2, column=1, sticky="EW", pady=5)

        pw_label = tk.Label(form, text="PASSWORD:", bg="white")
        pw_label.grid(row=2, column=0, sticky="NSEW")

        tk.Button(form, text='To page 2', command=self.changepage).grid(row=3, column=0)

        page.grid(pady=50, padx=50)
        form.grid()

    def UserEntryFocusIn(self, event):
        self.user.config(bg="white")

    def UserEntryFocusOut(self, event):
        self.user.config(bg="light gray")

    def PwEntryFocusIn(self, event):
        self.pw.config(bg="white")

    def PwEntryFocusOut(self, event):
        self.pw.config(bg="light gray")

    def page2(self):
        root = self.root

        page = tk.Frame(root)
        page.grid()
        tk.Label(page, text = 'This is page 2').grid(row = 0)
        tk.Button(page, text = 'To page 1', command = self.changepage).grid(row = 1)

    def changepage(self):
        root = self.root

        for widget in root.winfo_children():
            widget.destroy()
        if self.pagenum == 1:
            self.page2()
            self.pagenum = 2
        else:
            self.page1()
            self.pagenum = 1

root = tk.Tk()
card_game_gui = card_game_gui(root)
card_game_gui.page1()
root.mainloop()

Ожидаемый результат (отмеченная синим цветом область указывает, где должен быть фон, но не синий)

Expected output

Фактический объем производства

Actual output

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Рамка page, которой вы присвоили blue цвет, полностью упакована с дочерней рамкой form, которая имеет цвет фона white. Область, которую вы хотите сделать синей, - это не рамка, а область главного окна от отступа до рамки page. Поэтому вам нужно настроить цвет главного окна на blue.

import tkinter as tk

class card_game_gui:

    def __init__(self, root):
        self.pagenum = 1
        self.root = root

        #<-- configure color of your master window
        self.root.configure(background='blue')

    def page1(self):
        page = tk.Frame(self.root, bg="blue") #<-- this line has seemingly no effect
        form = tk.Frame(page, bg="white")
        self.root.grid_columnconfigure(0, weight=1)

        tk.Label(self.root, text='Add player', bg="dark gray").grid(row=0, column=0, columnspan=2, sticky="NESW")

        self.user = tk.Entry(form, bd=0, bg="light gray")
        self. user.bind("<FocusIn>", self.UserEntryFocusIn)
        self.user.bind("<FocusOut>", self.UserEntryFocusOut)
        self.user.grid(row=1, column=1, sticky="NSEW", pady=5)

        user_label = tk.Label(form, text="USERNAME:", bg="white")
        user_label.grid(row=1, column=0, sticky="NSEW")

        self.pw = tk.Entry(form, bd=0, bg="light gray", show="*")
        self.pw.bind("<FocusIn>", self.PwEntryFocusIn)
        self.pw.bind("<FocusOut>", self.PwEntryFocusOut)
        self.pw.grid(row=2, column=1, sticky="EW", pady=5)

        pw_label = tk.Label(form, text="PASSWORD:", bg="white")
        pw_label.grid(row=2, column=0, sticky="NSEW")

        tk.Button(form, text='To page 2', command=self.changepage).grid(row=3, column=0)

        page.grid(pady=50, padx=50)
        form.grid()

    def UserEntryFocusIn(self, event):
        self.user.config(bg="white")

    def UserEntryFocusOut(self, event):
        self.user.config(bg="light gray")

    def PwEntryFocusIn(self, event):
        self.pw.config(bg="white")

    def PwEntryFocusOut(self, event):
        self.pw.config(bg="light gray")

    def page2(self):
        root = self.root

        page = tk.Frame(root, bg='blue')
        page.grid()
        tk.Label(page, text = 'This is page 2').grid(row = 0)
        tk.Button(page, text = 'To page 1', command = self.changepage).grid(row = 1)

    def changepage(self):
        root = self.root

        for widget in root.winfo_children():
            widget.destroy()
        if self.pagenum == 1:
            self.page2()
            self.pagenum = 2
        else:
            self.page1()
            self.pagenum = 1

root = tk.Tk()
card_game_gui = card_game_gui(root)
card_game_gui.page1()
root.mainloop()

СТРАНИЦА 1

Синяя область фактически является областью главного окна (root окна) из значения заполнения 50 (padx и pady) к рамке page.

b

СТРАНИЦА 2

Так как вы не дали При любом заполнении виджетов на странице 2 у вас нет такой большой области главного окна.

page2

Я объяснил изменения с некоторой теорией. Я надеюсь, вы понимаете!

1 голос
/ 19 января 2020

Причина, по которой вы не видите изменения, заключается в том, что «страница» скрыта за «формой». Если вы хотите, чтобы эта область была синей, попробуйте добавить эту строку после 'root = tk.Tk ()'.

root.config (bg = 'blue')

enter image description here

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